【流媒体】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流

一、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)
    附-- 标准免费下载:PubliclyAvailableStandards
  2. MP4封装格式是基于QuickTime容器格式定义,媒体描述与媒体数据分开,目前被广泛应用于封装h.264视频和ACC音频,是高清视频/HDV的代表。
  3. 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分析如下:

  1. box结构图

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

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

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

  1. 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 code1字节00 00 01 或 00 00 00 01需要添加的
NALU header1字节如下3通过mdat定位

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

VCL负责高效视频内容表示
NAL以网络所要求的恰当方式对数据进行打包和发送
  1. 【定义】 NALU header

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

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

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

|F|NRI| Type |

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

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

毕书(P191)上的定义为:

  1. 【实例分析】数据分析,数据如上图mdat所示
6D 64 61 74mdat BOX TYPE
00 00 09 39silce长度,2361
接下来的65就是NALU header,可以由65&0x1F来求的后五个bit,从而得知此slice为I frame

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

Ref/Related
1 相关资料和工具在文中链接下载
2 http://www.52rd.com/Blog/wqyuwss/559/4/
3 http://blog.csdn.net/szu030606/article/details/5943279
4 http://blog.csdn.net/k1988/article/details/5654631
5 http://www.cppblog.com/czanyou/archive/2008/11/26/67940.html
6 http://krdai.info/blog/sps-pps-in-mp4-format.html
7 http://www.cnitblog.com/zouzheng/archive/2007/04/04/25155.html
8 http://bbs.chinavideo.org/viewthread.php?tid=10273

作者:skyseraph
出处:http://www.cnblogs.com/skyseraph/
更多精彩请直接访问SkySeraph个人站点:http://skyseraph.com//
Email/GTalk: zgzhaobo@gmail.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值