[转]【流媒體】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流
【流媒體】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流
SkySeraph Apr 1st 2012
Email:skyseraph00@163.com
一、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硬编码时会比较麻烦一点。
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
[转]【流媒體】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流的更多相关文章
- 嵌入式 H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流
一.MP4格式基本概念 MP4格式对应标准MPEG-4标准(ISO/IEC14496) 二.MP4封装格式核心概念 1 MP4封装格式对应标准为 ISO/IEC 14496-12(信息技术 视听对象 ...
- 多媒体开发之---H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流
一.MP4格式基本概念 MP4格式对应标准MPEG-4标准(ISO/IEC14496) 二.MP4封装格式核心概念 1 MP4封装格式对应标准为 ISO/IEC 14496-12(信息技术 视听对象 ...
- 【流媒體】live555—VS2008 下live555编译、使用及测试
[流媒體]live555—VS22008 下live555编译.使用及测试 Ⅰ live555简介 Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如R ...
- 【流媒體】live555—VS2010 下live555编译、使用及测试
Ⅰ live555简介 Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP.RTSP.SIP等的支持.Live555实现了对多种音视频编 ...
- 流媒體】jrtplib—VS2010下RTP开源协议库JRTPLIB3.9.1编译
一.JRTPLIB简介 老外用C++编写的开源RTP协议库,用来进行实时数据传输,可以运行在 Windows.Linux. FreeBSD.Solaris.Unix和VxWorks 等多种操作系统上, ...
- 使用ffmpeg从mp4文件中提取视频流到h264文件中
ffmpeg -i 2018.mp4 -codec copy -bsf: h264_mp4toannexb -f h264 tmp. 注释: -i 2018.mp4: 是输入的MP4文件 -code ...
- librtmp接收flv流中提取h264码流:根据多个资料汇总
rtmpdump可以下载rtmp流并保存成flv文件.如果要对流中的音频或视频单独处理,需要根据flv协议分别提取.简单修改rtmpdump代码,增加相应功能.1 提取音频:rtmpdump程序在Do ...
- Qt读取ANSI格式文件——利用QTextCodec将其他编码格式的QByteArray转换为Unicode格式,或者从文件中读出后直接做转换
t使用Unicode来表示字符串.但是通常需要访问一些非Unicode格式的字符串,例如打开一个GBK编码的中文文本文件,甚至一些非Unicode编码的日文,俄文等. Qt提供了QTextCodec类 ...
- php 把数组保存为标准的数组格式,存储到文件中
<?php $file='./test.php'; $array=array('color'=> array('blue','red','green'),'size'=> array ...
随机推荐
- nginx-vod-module && docker && docker-compose 测试
nginx-vod-module appdemo i reference [nginx-vod-module-docker](https://github.com/NYTimes/nginx-vod- ...
- 第01章-欢迎学习VTK
[译者:这个系列教程是以Kitware公司出版的<VTK User's Guide -11th edition>一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934- ...
- C语言使用pthread多线程编程(windows系统)二
我们进行多线程编程,可以有多种选择,可以使用WindowsAPI,如果你在使用GTK,也可以使用GTK实现了的线程库,如果你想让你的程序有更多的移植性你最好是选择POSIX中的Pthread函数库,我 ...
- eclipse中点不出来提示
当在用eclipse或是myeclipse时,可能会遇到不能自动提示,就是当你用到点的时候,后面不会出现相关的提示信息.这时,解决方法如下 : 1.菜单window->Preferences-& ...
- Javascript 全局函数是 window 的函数
比如以下函数,看起来不属于任何对象,但它是一个全局对象. 它属于 HTML页面的函数. function myFunction(a, b){ return a * b; } window.myFunc ...
- (转)性能分析之-- JAVA Thread Dump 分析综述
原文链接:http://blog.csdn.net/rachel_luo/article/details/8920596 最近在做性能测试,需要对线程堆栈进行分析,在网上收集了一些资料,学习完后,将相 ...
- 错误 1 缺少编译器要求的成员“System.Runtime.CompilerServices.ExtensionAttrib
错误 1 缺少编译器要求的成员“System.Runtime.CompilerServices.ExtensionAttrib 删除Newtonsoft.Json.dll 引用 ,再重新引用即可. 原 ...
- java课程设计-坦克大战
团队课程设计博客链接 个人负责模块 枚举类.工具类.子弹类.图片素材的查找,地图制作 Git管理 包名类名的命名 详细说明 枚举类 如 单人和双人模式 工具类 将每个图片的路径使用字符串保存,便于调用 ...
- [转]Web 调试工具之 Advanced REST client
原文:http://bbs.itcast.cn/forum.php?mod=viewthread&tid=85654 安装方式: 3.1. 如果你能FQ访问谷歌商店,那么就简单了 在这里直接安 ...
- [置顶]
caffe+CPU︱虚拟机+Ubuntu16.04+CPU+caffe安装笔记
由于虚拟机下的Ubuntu系统一般不包含GPU,故这次安装时为了在无GUP环境下运行caffe.所以只需安装CPU版本的caffe 由于本机是window10系统,所以想尝试caffe就在自己电脑上整 ...
