MP4封装解析

这篇具有很好参考价值的文章主要介绍了MP4封装解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

MP4封装格式比较常见,但是有些会有问题,下面解析一下具体信息

正文

工具

比较好的是mp4在线工具

MP4主要结构
MP4主要结构类似于树状图。每个节点开头都有8位,前四位记录大小,后四位标记节点类型。根节点一般包含四个字节点(ftyp,free,mdat,moov)。

  • ftyp(File Type Box)一般在文件的开始位置,描述的文件的版本、兼容协议等。
  • mdat 多媒体的存储位置
  • free预留位置,没用
  • moov 关键信息,记录多媒体轨道和索引信息

moov关键的是track。track节点中包含了tkhd,记录track信息。供播放器显示多媒体信息。media记录关键索引信息,解码器搜寻sample位置。
meida中的mdhd记录识别的总时长,以及时间粒度。供后边分析pts和cts等操作。minf节点中的stbl才是真的记录采样点的位置信息。以及计算方法。
这里有个比较重要的概念。chunk。他是一些编码后的数据,成为一簇。方便管理以及避免错误的干扰
下面解析一个750s的视频,有130个chunk。45008帧数据,

stsd

描述,不重要,

stts

描述数据帧的时间间隔。因为间隔大部分一样,所以是统计信息,

相同时间间隔个数 时间间隔(单位是moov-trak-media-mdhd-timescale的信息)

比如一个典型的数据是:

entry_count 1
samples {“sample_count”:45008,“sample_delta”:1001}

显示当前轨道,所有帧时长是一样的。都是16.683毫秒,帧率是59.94005994005994

而timescale是1/60000.所以总时长是 45008 * 1001 /timescale(60000) = 750.8834 秒。时长应该是 750秒。130个chunk。

stss

entry_count 130
sync_samples.0 1
sync_samples.1 207
sync_samples.2 397
sync_samples.3 713
sync_samples.4 939
sync_samples.5 1139
sync_samples.6 1437

用来记录关键帧。方便快速seek

ctts用来记录视频帧和显示时间的间隔。主要是解决视频向后参考关键帧。音频一般情况下只有一条,

entry_count 2
samples.0 {“sample_count”:1,“composition_offset”:1001}
samples.1 {“sample_count”:32339,“composition_offset”:0}

视频比较复杂:
如下

entry_count 36456
samples.0 {“sample_count”:1,“composition_offset”:1001}
samples.1 {“sample_count”:1,“composition_offset”:3003}
samples.2 {“sample_count”:2,“composition_offset”:0}
samples.3 {“sample_count”:3,“composition_offset”:1001}
samples.4 {“sample_count”:1,“composition_offset”:2002}
samples.5 {“sample_count”:1,“composition_offset”:0}
samples.6 {“sample_count”:1,“composition_offset”:1001}
samples.7 {“sample_count”:1,“composition_offset”:2002}
samples.8 {“sample_count”:1,“composition_offset”:0}
samples.9 {“sample_count”:4,“composition_offset”:1001}
samples.10 {“sample_count”:1,“composition_offset”:2002}

这个sample顺序cts是根据stts来计算的,根据之前分析,则sample则根据顺序排列

index cts dts

1 0 1001
2 1001 4004
3 2002 2002
4 3003 3003
5 4004 5005
6 5005 6006
7 6006 7007
8 7007 9009
9 8008 8008
10 9009 10010
11 10010 12012
13 11011 11011
14 12012 13013

比较明显,第二帧数据,应该在第四个时刻显示,但是第三,和第四帧解码需要第二帧,所以先解码第二帧,根据pts修正显示时刻。

stsc

sample-chunk映射表。

entry_count 61
chunks.0 {“first_chunk”:1,“samples_per_chunk”:206,“sample_description_index”:1}
chunks.1 {“first_chunk”:2,“samples_per_chunk”:190,“sample_description_index”:1}
chunks.2 {“first_chunk”:3,“samples_per_chunk”:316,“sample_description_index”:1}
chunks.59 {“first_chunk”:62,“samples_per_chunk”:420,“sample_description_index”:1}
chunks.60 {“first_chunk”:130,“samples_per_chunk”:458,“sample_description_index”:1}

这是记录chunk 一共130个。每个chunk可能有不同的sample。比如第一个有206 62到 130 的chunk每个里面有458个。

stsz

每个sample的字节大小

sample_count 45008
sample_size.0 513
sample_size.1 270
sample_size.2 85
sample_size.3 89
sample_size.4 1258
sample_size.5 1581

stco

每个chunk在文件中的偏移

entry_count 130
chunk_offset.0 48
chunk_offset.1 1011504
chunk_offset.2 3302476
chunk_offset.129 213665857

这些用来记录关键的chunk的位置,具体每个sample参考sample具体的位置

后记

MP4的解析基本完成。原理还是比较 简单,以后如果写完解码器,自己就手写一个解封装模块,实现必要的功能文章来源地址https://www.toymoban.com/news/detail-800240.html

到了这里,关于MP4封装解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 音视频编码实战-------pcm+yuv数据转成MP4

    avcodec_find_encoder: 根据编码器ID查找编码器 avcodec_alloc_context3:创建编码器上下文 avcodec_open2:打开编码器 avformat_alloc_output_context2:为输出格式创建复用器上下文 avformat_new_stream:创建音视频流 avcodec_parameters_from_context:将编码器上下文中的参数拷贝到音视频流中的编码器参数中AVCodec

    2024年02月15日
    浏览(60)
  • 音视频知识:MPEG-4、H264、MP4、AAC之间的关系

    MPEG-4 一种编码标准。是国际标准化组织 (ISO) 主要针对消费类应用,已经针对运动图像压缩定义的标准。MPEG(Moving Picture Experts Group)标准包括 MPEG1、MPEG2与 MPEG4。 MPEG-4标准目前分为27个部分,统称为ISO/IEC14496国际标准。其中第10部分(ISO/IEC 14496-10)就是熟悉的高级视频编码

    2024年02月14日
    浏览(66)
  • Qt音视频开发47-文字和图片水印(可存储到MP4中)

    近期花了两周时间闭门啃硬骨头,主要就解决三个问题(音视频同步存储和推流、图片水印并将水印信息存储到文件或者推流、rtsp推流),这三个问题困扰了很多年,以至于找遍了网络和翻遍ffplay代码以及ffmpeg示例的代码,通过不下于上百次方案的调整和测试,几乎每次都是

    2024年02月16日
    浏览(50)
  • 【音视频笔记】Mediacodec+Muxer生成mp4,浏览器无法播放问题处理

    最近在测试视频录制功能时发现,AudioRecord + MediaCodec + MediaMuxer生成的MP4,PC浏览器无法播放 ,但是Android、Windows、Mac的播放器应用都能正常播放。虽然不禁想吐槽浏览器视频组件的容错性差,但我也意识生成的文件格式肯定也是有问题的。 然后尝试了合成MP4视频时,只保留视

    2024年02月07日
    浏览(90)
  • JavaScript音视频,使用JavaScript如何在浏览器录制电脑摄像头画面为MP4视频文件并下载视频文件到本地

    本章介绍使用JavaScript如何在浏览器录制电脑摄像头画面为MP4视频文件并下载视频文件到本地。 1、使用navigator.mediaDevices.getUserMedia获取摄像头画面 2、将获取到的摄像头画面渲染到canvas画板上 3、将canvas转换为blob对象 4、通过document.createElement(‘a’)调用 href 方法获取此链接并触

    2024年02月02日
    浏览(79)
  • 「Python|音视频处理|场景案例」如何使用ffmpeg下载m3u8视频到本地并保存成mp4

    本文主要介绍如何使用ffmpeg批量下载视频到本地并保存成指定格式。 当我们希望将网页上的视频下载到本地的时候,我们可能获取到的视频地址是指向 .m3u8 格式的,当视频多的时候,手动下载并使用工具转换格式就显得工作量过大。 ffmpeg 是一个强大的音视频处理工具,具体

    2024年02月16日
    浏览(72)
  • Qt/C++音视频开发69-保存监控pcm音频数据到mp4文件/监控录像/录像存储和回放/264/265/aac/pcm等

    用ffmpeg做音视频保存到mp4文件,都会遇到一个问题,尤其是在视频监控行业,就是监控摄像头设置的音频是PCM/G711A/G711U,解码后对应的格式是pcm_s16be/pcm_alaw/pcm_mulaw,将这个原始的音频流保存到mp4文件是会报错的,在调用avformat_write_header写文件头的时候提示(-22) Invalid argument,

    2024年04月11日
    浏览(56)
  • ffmpeg把RTSP流分段录制成MP4,如果能把ffmpeg.exe改成ffmpeg.dll用,那音视频开发的难度直接就降一个维度啊

    比如,原来我们要用ffmpeg录一段RTSP视频流转成MP4,我们有两种方案: 方案一:可以使用以下命令将rtsp流分段存储为mp4文件 ffmpeg -i rtsp://example.com/stream -vcodec copy -acodec aac -f segment -segment_time 3600 -reset_timestamps 1 -strftime 1 output_%Y-%m-%d_%H-%M-%S.mp4 方案二:可以直接调用ffmpeg库avcode

    2024年02月10日
    浏览(55)
  • MP4封装解析

    MP4封装格式比较常见,但是有些会有问题,下面解析一下具体信息 工具 比较好的是mp4在线工具 MP4主要结构 MP4主要结构类似于树状图。每个节点开头都有8位,前四位记录大小,后四位标记节点类型。根节点一般包含四个字节点(ftyp,free,mdat,moov)。 ftyp(File Type Box)一般

    2024年01月18日
    浏览(23)
  • 【音视频原理】音视频 “ 采样 - 编码 - 封装 过程 “ 和 “ 解封装 - 解码 - 播放 过程 “ 分析 ( 视频采集处理流程 | 音频采集处理流程 | 音视频文件解封装播放流程 )

    本篇文件主要分析 音视频文件 是怎么产生的 , 以及 音视频文件是如何播放的 ; 视频文件从录像到生成文件的全过程 : 采集图像帧 : 摄像头 硬件 负责 采集画面 , 采集的 初始画面 称为 \\\" 图像帧 \\\" , 一秒钟 采集 的 图像帧 数量 称为 \\\" 帧率 \\\" , 如 : 60 帧 就是 一秒钟采集 60 个画

    2024年02月11日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包