一、MP4格式基本概念

MP4格式对应标准MPEG-4标准(ISO/IEC14496)


二、MP4封装格式核心概念

1  MP4封装格式对应标准为 ISO/IEC 14496-12(信息技术 视听对象编码的第12部分: ISO 基本媒体文件格式/Information technology Coding of audio-visual objects Part 12: ISO base media file format)

 附-- 标准免费下载: Freely Available Standards    http://standards.iso.org/ittf/PubliclyAvailableStandards/index.html

2  MP4封装格式是基于QuickTime容器格式定义,媒体描述与媒体数据分开,目前被广泛应用于封装h.264视频和ACC音频,是高清视频/HDV的代表。

 MP4文件中所有数据都封装在box中(对应QuickTime中的atom),即MP4文件是由若干个box组成,每个box有长度和类型,每个box中还可以包含另外的子box(称container box)。

 一个MP4文件首先会有且只有一个“ftyp”类型的box,作为MP4格式的标志并包含关于文件的一些信息;之后会有且只有一个“moov”类型的box(Movie Box),它是一种container box,子box包含了媒体的metadata信息;MP4文件的媒体数据包含在“mdat”类型的box(Midia Data Box)中,该类型的box也是container box,可以有多个,也可以没有(当媒体数据全部引用其他文件时),媒体数据的结构由metadata进行描述。

4  MP4中box存储方式为大端模式。一般,标准的box开头会有四个字节的box size。

5 几个名词

track

表示一些sample的集合,对于媒体数据来说,track表示一个视频或音频序列。

hint track

特殊的track,并不包含媒体数据,包含的是一些将其他数据track打包成流媒体的指示信息。

sample

对于非hint   track来说,video sample即为一帧视频,或一组连续视频帧,audio sample即为一段连续的压缩音频,它们统称sample。

对于hint   track,sample定义一个或多个流媒体包的格式。

sample table

指明sampe时序和物理布局的表。

chunk

一个track的几个sample组成的单元。


三、MP4封装格式结构图

1 实例样本

来源于Android MediaRecoder视频录制,平台为华为T8300和TCL968,mp4info查看如下

EsEYE查看如下:

winhex分析如下:

2 box结构图

接下来对h264编码中有用的几个进行阐述,其它不再描述。

3 ftyp(file type box)

如下图所示,开始的四字节00 00 00 00 18表示该box的size为24字节(含头),然后66 74 79 70是ftyp的BOX TYPE,其它是一些格式兼容等相关信息。

4  mdat

如下图所示,BOX YPE为6D 64 61 74 ,紧接着的00 00 09 39表示sliece长度

5 avcC

如下图所示,红色为BOX TYPE


四、MP4文件中h264的 SPS、PPS获取

1  【参考依据】ISO/IEC 14496-15 (下载

2  【综述】在H264中,SPS和PPS存在于NALU header中,而在MP4文件中,SPS和PPS存在于AVCDecoderConfigurationRecord, 首先要定位avcC.

3  【定义】

①参数集:一组很少改变的,为大量VCL NALU 提供解码信息的数据。

序列参数集SPS作用于一系列连续的编码图像,而图像参数集PPS作用于编码视频序列中一个或多个独立的图像。

如果解码器没能正确接收到这两个参数集,那么其他NALU 也是无法解码的。因此它们一般在发送其它 NALU 之前发送,并且使用不同的信道或者更加可靠的传输协议(如TCP)进行传输,也可以重复传输。

②关于AVCDecoderConfigurationRecord结构定义为  

4  【实例分析】 数据如上avcC图所示,现在对数据进行详细分析

所以,提取的SPS和PPS分别为67 42 00 1E A6 81 41 F9和68 CE 38 80


五、MP4文件中的H264 data /NALU slice

1  【参考】H264官方文档(下载) + 毕书—新一代视频压缩编码标准(下载

2  【综述】

① 在MP4格式文件中,H264 slice并不是以00 00 00 01来作分割,而是存储在mdat box中。

②  H264基本码流由一些列的NALU组成。原始的NALU单元组成:[start code] + [NALU header] + [NALU payload]

start   code

1字节

00 00 01 或 00 00 00 01

需要添加的

NALU header

1字节

如下3

通过mdat定位

③  H264基本码流结构分两层:视频编码层VCL和网络适配层NAL,这样使信号处理和网路传输分离

VCL

负责高效视频内容表示

NAL

以网络所要求的恰当方式对数据进行打包和发送

3  【定义】 NALU header

+---------------+

|0|1|2|3|4|5|6|7|

+-+-+-+-+-+-+-+-+

|F|NRI| Type |

+---------------+

特别的,当值为7和8分别为SPS和PPS。

毕书(下载)(P191)上的定义为:

4  【实例分析】数据分析,数据如上图mdat所示

6D 64 61 74

mdat   BOX TYPE

00 00   09 39

silce长度,2361

接下来的65就是NALU header,可以由65&0x1F来求的后五个bit,从而得知此slice为I frame

注意,mdat与silce之间有可能存在若干占位符,我在TCL手机测试时就出现了连续的00的占位符,这样后面用H264硬编码时会比较麻烦一点。


Ref/Related

1 相关资料和工具在文中链接下载

http://www.52rd.com/Blog/wqyuwss/559/4/

http://blog.csdn.net/szu030606/article/details/5943279

http://blog.csdn.net/k1988/article/details/5654631

http://www.cppblog.com/czanyou/archive/2008/11/26/67940.html

http://krdai.info/blog/sps-pps-in-mp4-format.html

http://www.cnitblog.com/zouzheng/archive/2007/04/04/25155.html

http://bbs.chinavideo.org/viewthread.php?tid=10273

http://www.cnblogs.com/skyseraph/archive/2012/04/01/2429384.html

最新文章

  1. 手把手教你搭建深度学习平台——避坑安装theano+CUDA
  2. Android之TabActivity的使用
  3. ORA-12516:TNS:listener could not find available handler with matching protocol stack
  4. python 之readability与BeautifulSoup
  5. phpcmsv9的评论分表策略
  6. IOS中的多线程之GCD
  7. 解析 MACH_O 文件
  8. 9款经典华丽的CSS3分享按钮
  9. shell 检测ip的合法性与检测网络掩码的合法性
  10. .Net设计模式_原型模式
  11. Android应用打包安装过程具体解释
  12. sql小总结
  13. LINUX SCP 远程 文件 复制
  14. javascript OOP 面向对象编程
  15. 如何用php实现简单的文件上传功能?(带图解)
  16. python列表的操作
  17. ie下常见的css兼容问题
  18. 找出链表中倒数第K个结点
  19. 不在models.py中的models
  20. CentOS7.6配置do.cker和K.B.S

热门文章

  1. iOS开发 Swift开发数独游戏(四) 游戏界面的界面与逻辑
  2. 彻底理解H5的DOM事件
  3. iis7文件夹 首页设置
  4. 常用VBA小技巧
  5. [置顶] kubernetes--资源管理
  6. DELLR720服务器更换硬盘,启动系统报错:there are offline or missing virtual drivers with preserved cache
  7. 什么是滤波器,滤波器是干嘛用的,IIR和FIR滤波器又是什么?(回答请简洁,别浪费大家时间)
  8. Linux zip
  9. python读写文件write和flush
  10. Android插件化开发,初入殿堂