MP4文件格式解析
1. 视频文件总体介绍
(1)视频文件的本质:记录压缩后的视频帧并且能被播放器还原解码播放。
我们对这段视频进行解析,首先要找到关键帧(I帧),关键帧之前的部分是
没法播放的,如果那些P和B帧的I帧丢失了就找不到参考帧,就没法播放。
用快递来做比喻:mp4处理的是如何打包的问题,h.264就是你快递盒里面装的产品,
如果我的快递买的是一个刷锅的刷子,刷子怎么刷锅那是刷子的事,那我怎么把刷
字打包运过去就是物流公司的事,mp4处理的就是快递公司的事,h.264处理的就是
处理刷锅刷子的事。
(2)视频文件的关键
a.高效率记录信息(我可以对他打包其实很容易,如果打包得好,人家就会达到效率的最高化,
比如说,同一段压缩后的h.264码流,人家mp4打包得好,打包出来的是50MB,你自己发明
的打包出来的可能就是55MB,那你为什么会多长5MB呢?就是因为你的信息不够简练,
所以你就会变得比较冗余,这就是一种不够高效的体现;另外一种不够高效的表示就是时间方面:
mp4可能只需要1秒钟,如果你的算法不够好,或者你的数据结构设计的不够优秀,那你打包出来
就要2秒钟,解出来也需要2秒钟,所以高效率就是体现在时间和空间上面,为什么大家都用mp4呢?
因为mp4他的格式设计的比较好,所以他的打包和解包的过程都比较快)。
b.兼容性(mp4中有很多种标准,有很多种box,不见得所有的播放器和所有的编码器都支持
所有的box,所以这里面就有一个兼容性的问题,有时候就会发现你拿一个mp4的文件,肯能拿这个
播放器去播放大部分是可以播放的,但是有一些文件是不能播放的,这里就涉及一个兼容性的问题)
所以视频文件的定义就在于解决这两个关键性的问题。你解决得越好,你这个视频文件就越优秀,
用的人就会越多。所以为什么mp4现在大量人在使用呢?是因为mp4把这两个东西解决得都比较好。
(3)视频文件的信息
其实包含两部分的内容,索引信息(就是记录那些有效信息怎么被安排的索引,
),有效信息(视频和音频文件里面真正和视频和音频有关的部分,
其实就是I帧,P帧,B帧,音频部分就是音频编码之后生成的码流)
7.1.2、MP4格式总体介绍
(1)MP4由MP3升级而来,包含video和audio在内,mp3是纯音频的
video部分的编码常用的就是h.264,audio部分的编码常用的就是
(2)MP4是h.264的最主流打包格式
还有avi、flv格式等
(3)MP4文件内部采用网络字节序(大端模式)
7.1.3 MP4学习路线
(1)学习MP4的组织形式和box解析
你可以认为box就是MP4一个最基本单元,每个box自成体系,MP4就是由一个一个box组成的,
很多个box加起来就构成MP4文件,为什么要这么设计?怕丢,怕弄错,网络上传输的时候经常
容易弄错或者丢,我们把很大一个MP4文件分成很多个box,传输过程中丢了一个或两个box可以接受
的,box分很多个种类,每个box的种类和定义是不一样的,我们要学习常用的box,每个box起什么作用。
(2)移植和使用mp4v2开源库来打包MP4
打包的过程如果让我们自己写代码来完成是比较复杂的,mp4v2这个开源库把很大操作封装成了API,
我们直接调用这个API就可以完成相应的功能。
(3)进一步研究MP4解包播放和mp4v2源码
(4)自己编程进程MP4的打包、解包、分割等
解包是播放器那边做的事,定制化需求,比如可以做成自己可以播放别人的播放器不能播
分割就是大文件分成小文件,分割的过程就是先解包再打包的过程,具体就是例如把10分钟大文件先解开,
解出来之后呢再把它里面有效信息分成两个5分钟的,然后每个单独的五分钟再去构建索要信息。
7.2 MPEG-4简称MP4
MP4视频文件封装格式是基于QuickTime(苹果的)容器格式定义的,因此参考QuickTime的格式定义对理解MP4
文件格式很有帮助。
MP4文件中的媒体描述与媒体数据是分开的,并且媒体数据的组织也是很自由,不一定要按照时间顺序排列,
意思就是说,下一帧图像在时间上有可能滞后于上一帧图像,这就需要一个缓冲。这样就比较耗内存。
沈总媒体数据可以直接引用其他文件。
意思是中间可以插入一个指针,播放其他是视频文件。
同时MP4也支持流媒体。
意思是MP4文件支持网络边下载边播放。
MP4目前被广泛用于封装h.264视频和AAC音频,是高清视频的代表。
MP4文件中的所有数据都装在box(box就是封装单元,就像我们送快递的时候,每一个快递都被装在一个
快递箱子,这个快递箱有大有小,有各种材料制成的,有各种颜色,有些是方的,有些是长的)中,
也就是说MP4文件由若干个box组成,我们来解析MP4的时候其实也是一个box一个box来解析的,每个box有
类型和长度,可以将box理解为一个数据对象块,box中可以包含另外一个box(意思是box里面可以包含指针
指向另外一个box),这种box称为container box。一个MP4文件首先会有且只有一个ftyp类型的box(用来标识
文件的类型的),作为MP4格式的标志并包含关于文件的一些信息,之后会有且只有一个moov类型的box(movie box),
它是一种container box,子box包含了媒体的metadata信息,MP4文件的媒体数据(真正的有效信息,一帧一帧的图像
)包含在mdat类型的box(Midea Data Box)中,改类型的box也是container box,可以有很多个(指的是多个帧),
也可以没有(当媒体数据全部引用其他文件时,根本就不包含任何有效实体的图像信息,一个I帧一个P帧都没有),
媒体数据的结构由metadata进行描述。
(1)整个MP4文件由若干个各种不同的box组成,打包和解包 时都是以box为单位的,假如中间有一个box坏掉了,
前面和后面的box还是可以用的。所以这种做法还是有好处的,不至于说是整个文件用不了。
(2)MP4中有且只有一个ftyp box,该box位于整个MP4的开头位置,如果把把一段MP4开头截掉了,这个MP4文件
就不能用了,你把标志信息拿走了,播放器不认识了,
7.3 MP4Info工具使用