嵌入式 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)

 附-- 标准免费下载: 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 实例样本

来源于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硬编码时会比较麻烦一点。

时间: 2024-08-04 08:05:57

嵌入式 H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流的相关文章

python-Python 编写以文件名为输入参数,可在文件中提取作者名字的函数

问题描述 Python 编写以文件名为输入参数,可在文件中提取作者名字的函数 Python初学者,这是最近看的<Python编程实践>中dict和set那一章的课后题,实在是解决不了,也没搜索到其他的经验贴,希望各位大神指教下,以下是题目: PDB文件格式常常用于存储有关分子的信息.一个PDB文件中可能含有零个或多个以单词AUTHOR(可能全大写,也可能全小写,还可能大小写混排)开始的行,然后是一些空格或者制表符,再然后是创建该文件的人的姓名.编写一个函数,以一个**文件名列表**为输入参数,

vb.net 数据库 从txt文件中提取数据显示在数据库上

问题描述 vb.net 数据库 从txt文件中提取数据显示在数据库上 哪位大神帮我写个简单代码,从txt文件中提取数据,然后显示在数据库中,并且修改之后又可以保存在txt中,可以一起商量写.会有相当酬劳.联系我qq1184218831 解决方案 File.ReadAllLines(你的文本文件) 这样就可以读取到数组中 然后用Split分割列. 解决方案二: 文本中的数据不规则,是通过先查找,做成数组,在显示到数据里,如果你会做,我能加你qq,咨询你吗? 解决方案三: 用正则表达式去过滤.

破解-如何从APK文件中提取组件?

问题描述 如何从APK文件中提取组件? http://shouji.baidu.com/soft/item?docid=7618429&from=web_alad_6风水罗盘实景apk文件里面的罗盘针做的很精致漂亮,怎么能把它单独提取出来做成罗盘针apk?期望高人指点或帮助,谢谢!我的邮箱jyyy66@126.com 解决方案 将apk反编译,就可以提取源码了 反编译工具链接:http://download.csdn.net/detail/u014682413/7465187

如何自己写代码从pdf文件中提取纯文本

问题描述 最近做一个毕设,关于从pdf文件中提取纯文本的.从网上找了一段C写的代码,可以简单的实现从pdf中抽取文本,不过,只能提取英文,而不能提取汉字.研究了几天了,仍无头绪,急求大侠帮忙.下面附上c语言代码.#include<stdio.h>#include<windows.h>//YOurprojectmustalsoincludezdll.lib(ZLIB)asadependency.//ZLIBcanbefreelydownloadedfromtheinternet,ww

如何在iso文件中提取gho系统文件

首先我们的电脑要有压缩的软件,比如WinRAR之类的,一般电脑默认带的都有,不用担心的.首先找到自己下载的那个iso文件. 如何看自己下载的是什么格式呢?找到自己下载的文件,然后点击右键,找到属性,点击 点击属性以后,就会看到这个文件的一个基本信息,画的红圈里面的就是文件类型,属于iso 然后我们双击我们下载的这个iso系统文件,打开 然后点击,里面的一个ghost文件,这个是xp的系统 然后找到后缀是gho的文件,里面有两个的情况下,要看清楚,首先你下载的是系统,因此名称要符合.另外就要看数据

如何从ppt文件中导出声音和图片文件

打开PPT文件,如图: 1.选择"文件"->"另存为网页格式" 2.在另存为对话框中,文件类型要选择"网页格式"(*.htm,*.html) 3.选择一个文件夹,输入文件名 4.点击"确定" PowerPoint会创建一个简单的HTML文件(www.pptbz.com提供教程),文件名就是你输入的文件名.同时,还创建了一个新文件夹,叫做 文件名_Files ......比如,你输入的文件名为 MyFile ,那么Powe

在Linux 统下从ISO镜像中提取和复制文件的3种方法

假设你的 Linux 服务器上有一个超大的 ISO 镜像文件,你想要打开它,然后提取或者复制其中的一个文件.你会怎么做呢? 其实在 Linux 系统里,有很多方法来实现这个要求. 比如说,你可以使用传统的 mount 命令以只读方式把 ISO 镜像文件加载为 loop 设备,然后再把文件复制到另一个目录. 在 Linux 系统下提取 ISO 镜像文件 为了完成该测试,你得有一个 ISO 镜像文件(我使用 ubuntu-16.10-server-amd64.iso 系统镜像文件)以及用于挂载和提取

【FFMpeg视频开发与应用基础】三、调用FFmpeg SDK对H.264格式的视频压缩码流进行解码

<FFMpeg视频开发与应用基础--使用FFMpeg工具与SDK>视频教程已经在"CSDN学院"上线,视频中包含了从0开始逐行代码实现FFMpeg视频开发的过程,欢迎观看!链接地址:FFMpeg视频开发与应用基础--使用FFMpeg工具与SDK 工程代码地址:FFmpeg_Tutorial 经过了上篇调用FFMpeg SDK对视频进行编码的过程之后,我们可以比较容易地理解本篇的内容,即上一篇的逆过程--将H.264格式的裸码流解码为像素格式的图像信息. 1.FFMpeg视频

在 Linux 系统下从 ISO 镜像中提取和复制文件的 3 种方法

假设你的 Linux 服务器上有一个超大的 ISO 镜像文件,你想要打开它,然后提取或者复制其中的一个文件.你会怎么做呢? 其实在 Linux 系统里,有很多方法来实现这个要求. 比如说,你可以使用传统的 mount 命令以只读方式把 ISO 镜像文件加载为 loop 设备,然后再把文件复制到另一个目录. 在 Linux 系统下提取 ISO 镜像文件 为了完成该测试,你得有一个 ISO 镜像文件(我使用 ubuntu-16.10-server-amd64.iso 系统镜像文件)以及用于挂载和提取