音视频封装:MP4结构概述和分析工具
Original 潇湘落木 智媒黑板报 2019-10-09 18:15
问题背景:
前面已经讲了好几种封装格式包括了TS、FLV、RTP等。现在用几篇文章讲解下MP4,这种封装格式设计思路和前面都不太一样,其应用范围最广、灵活性最高、跨平台最好,兼容性最强。带来的负面影响就是格式本身比较复杂,特别是在封装和转封装方面代码实现起来比较长。
这个系列会和前面讲解思路一样,本篇会讲解下MP4的整体框架和结构,下篇会讲解下MP4的详细标准,同时用一个实例分析下对应字段含义以及H264打包方法,最后一篇文章讲下MP4的应用,内容大致包含:
-
计算电影图像宽度和高度
-
计算电影声音采样频率
-
计算视频帧率
-
计算电影的比特率
-
查找sample方法
-
查找关键帧和实现随机拖动播放
7.如何完成MP4首屏秒开即前置moov box
你可以选择你感兴趣的篇章进行阅读,欢迎后台分享MP4在实际应用的案例分享,特别是关于H265方面的实践。我后面还会分享下基于HLS协议的FFmpeg对H265的FMP4切片在平安校园方面的实践。
MP4概念&术语:
概念:
MP4起源于QuickTime,全名是MPEG-4 Part 14,属于MPEG-4的一部分。这部分内容主要规定了多媒体容器的格式。后来成为”ISO/IEC 14996-14”国际标准, 其中MP4就是对这种标准的一种具体实现,基于这个标准进行扩展或者裁剪还产生了像M4V、F4V等封装格式。
同时MP4目前在移动端的Androids和IOS可以播放,也可以在FlashPlayer播放,跨平台和兼容性最好,MP4 还可以实现快进快放,边下载边播放的效果。
术语:
为了后面能比较规范的了解这种文件格式,这里需要了解下面几个概念和术语,这些概念和术语是理解好MP4媒体封装格式和其操作算法的关键。
Box:这个概念起源于QuickTime中的atom,也就是说MP4文件就是由一个个Box组成的,可以将其理解为一个数据块,它由Header+Data组成,Data 可以存储媒体元数据和实际的音视频码流数据。Box里面可以直接存储数据块但是也可以包含其它类型的Box,我们把这种Box又称为container box。
Sample:简单理解为采样,对于视频可以理解为一帧数据,音频一帧数据就是一段固定时间的音频数据,可以由多个Sample数据组成,简而言之:存储媒体数据的单位是sample。
Track:表示一些sample的集合,对于媒体数据而言就是一个视频序列或者音频序列,我们常说的音频轨和视频轨可以对照到这个概念上。当然除了Video Track和Audio Track还可以有非媒体数据,比如Hint Track,这种类型的Track就不包含媒体数据,可以包含一些将其他数据打包成媒体数据的指示信息或者字幕信息。简单来说:Track 就是电影中可以独立操作的媒体单位。
Chunk:一个track的连续几个sample组成的单元被称为chunk,每个chunk在文件中有一个偏移量,整个偏移量从文件头算起,在这个chunk内,sample是连续存储的。
这样就可以理解为MP4文件里面有多个Track,一个Track又是由多个Chunk组成,每个Chunk里面包含着一组连续的Sample.正是因为定义了上述几个概念,MP4这种封装格式才容易实现灵活、高效、开放的特性,所以要仔细理解。
MP4整体结构:
虽然Box的类型非常多,大概有70多种,但是并不是都是必须的,一般的MP4文件都是含有必须的Box和个别非必须Box,我用MP4info这种工具分析了一首MP4的文件,具体的Box显示如下:
通过上述工具分析出来的结果,我们大概可以总结出MP4以下几个特点:
-
MP4文件就是由一个个Box组成,其中Box还可以相互嵌套,排列紧凑没有多的冗余数据;
-
Box类型并没有很多,主要是由必须的ftyb、mdat、moovz组成,还有free,udta非必须box组成即去掉这两种box对于播放音视频也没有啥影响。
-
Moov一般存储媒体元数据,比较复杂嵌套层次比较深,后面会详细解释各个box的字段含义和组成。
其中每个Box的结构如下:
其中在Box的Header头部,size指定了这个Box所占用的大小,包括了Header部分,一般的头部大小就是8字节,但是如果Box很大,超过了uint32的最大数值,则size被置为1,并用接下来的8字节uint64来表示该Box的大小,这样头部大小就变成16字节了。
正常情况Box不会太大,但是当box里面承载的音视频数据特别是I帧时,有可能Box会很大,除了mdat box,其它的Box都很小。
把上面分析的结果进行简化,可以得到一个基本的MP4完整结构:
这里各个Box承载的数据内容是什么,下面表格先做个大致解释,Box字段以及分析下篇文章做出说明:
下面再给出一张表格,显示下标准中所有Box类型:
说明:
我们只讲带星号的 box。其他的因为不是必须 box,我们就选择性的忽略了。不过,里面带星号的 Box 还是挺多的。因为,我们的主要目的是为了生成一个 MP4 文件。一个正常的 MP4 文件的结构并不是所有带星号的 Box 都必须有。
MP4分析工具推荐:
- mp4info
这个工具好处是带界面的可视化工具,可以清晰看到各个box的组成和层次,同时可以分离里面的音视频文件,当然这个分离出的原始码流不能直接播放。其次可以看到音视频的时间戳等信息,这对于解决一些花屏和播放跳秒等问题排查有帮助。
2. Mp4Explorer
这个工具的官网是:http://mp4explorer.codeplex.com/比较前面Mp4info的好处是,这个工具可以对各个Box进行格式化,可以直接提取里面的各个主要字段含义。其次源代码也是开发的,可以研究和实现Mp4的解封装。其次还支持对FMp4文件的分析,这点也是比较好的。
上面直接就看到了tkhd这种Box的各个字段含义,其中这个Box就表明了视频Track的分辨率,时长等信息。
- Ffmpeg和Mp4Box
这两个工具是处理MP4文件的利器,包括合并,分割,解封装,转封装封操作。凡是你能想到的对Mp4文件操作都可以用该工具处理,下载地址:https://gpac.wp.imt.fr/downloads/
4. Elcard StreamEye
这个工具比较强大,主要是为了检测MP4封装的实际编码内容,包括帧类型信息、流的信息等,还可以逐帧播放等,如果觉得封装没问题直接想查看里面编码层内容那就是分析利器,前面其它封装格式也推荐过该工具。
5. Video Eye
这个工具也不错,是雷神基于开源开发的,用起来比较好。我用这个工具可以播放一些在线视频,对于开发一些基于HTTP的Mp4业务有一定的调试作用,当然功能比这个要强大的多。
其中我还进行了抓包,分析了下HTTP-MP4的交互过程,做过类似业务的同学可以交流下:
以上工具我都放在Git地址下面了:https://github.com/ty6815/AvStackDocs 大家可以随意下载和使用。
总结:
这篇文章主要普及了MP4涉及的几个关键概念,其次讲解了主要结构和基本组成,最后给大家推荐了几款分析MP4文件的工具,下篇主要讲解下核心Box的字段含义。