在MP4文件中提取H264的SPS、PPS及码流

一、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的代表。
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.实例分析

用mp4info查看如下:

在MP4文件中提取H264的SPS、PPS及码流_第1张图片

用winhex分析如下:

在MP4文件中提取H264的SPS、PPS及码流_第2张图片

2 box结构图

在MP4文件中提取H264的SPS、PPS及码流_第3张图片


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

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

在MP4文件中提取H264的SPS、PPS及码流_第4张图片

4  mdat
如下图所示,BOX TYPE为6D 64 61 74

在MP4文件中提取H264的SPS、PPS及码流_第5张图片

5 avcC
如下图所示,红色为BOX TYPE

在MP4文件中提取H264的SPS、PPS及码流_第6张图片

三、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结构定义为

在MP4文件中提取H264的SPS、PPS及码流_第7张图片

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

在MP4文件中提取H264的SPS、PPS及码流_第8张图片

在MP4文件中提取H264的SPS、PPS及码流_第9张图片

所以,提取的SPS为 67 64 00 1F AC D3 07 82 FF 97 02 10 00 00 03 00 10 00 00 03 03 29 F1 83 13 80

PPS为 68 EA EC B2 2C

四、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]


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

3  【定义】 NALU header

在MP4文件中提取H264的SPS、PPS及码流_第10张图片

特别的,当值为7和8分别为SPS和PPS。 毕书上的定义为:

在MP4文件中提取H264的SPS、PPS及码流_第11张图片

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

 

你可能感兴趣的:(流媒体)