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

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

SkySeraph Apr 1st 2012 

Email:[email protected].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的代表。

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进行描述。

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

时间: 2024-12-28 22:24:02

[转]【流媒體】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流的相关文章

C#控制台基础 在博客备份xml文件中提取所有博文的标题 (正则,流读取)

镇场诗: 清心感悟智慧语,不着世间名与利.学水处下纳百川,舍尽贡高我慢意. 学有小成返哺根,愿铸一良心博客.诚心于此写经验,愿见文者得启发.------------------------------------------ introduction: 解析 博客园-博客备份 生成的XML文件,获得所有博文的标题. code: 1 using System; 2 using System.Collections.Generic; 3 using System.IO; 4 using System

【流媒體】live555—VS2008 下live555编译、使用及测试(一)

[流媒體]live555—VS22008 下live555编译.使用及测试 Ⅰ live555简介 Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP.RTSP.SIP等的支持.Live555实现了对多种音视频编码格式的音视频数据的流化.接收和处理等支持,包括MPEG.H.263+.DV.JPEG视频和多种音频编码.同时由于良好的设计,Live555非常容易扩展对其他格式的支持.目前,Live555已经被用于多款播放器的流媒体播放功

流编辑器sed使用总结及利用sed从文本中提取字符串的方法

sed 是一个编辑器,但它与其它大多数编辑器不同.除了不面向屏幕之外,它还是非交互式的,我们常用的vim编辑器则是交互式的. 这意味着必须将要对数据执行的命令插入到命令行或要处 理的脚本中.sed 在一个文件(或文件集)中非交互式.并且不加询问地接收一系列的命令并执行它们.因而,它流经文本就如同水流经溪流一样,因而 sed 恰当地代表了流编辑器,可以对文件或者文件集批量的进行删除 替换 插入 追加等操作. 流编辑器非常适合于执行重复的编辑,这种重复编辑如果由人工完成将花费大量的时间. 其参数可能

Qt读取ANSI格式文件——利用QTextCodec将其他编码格式的QByteArray转换为Unicode格式,或者从文件中读出后直接做转换

t使用Unicode来表示字符串.但是通常需要访问一些非Unicode格式的字符串,例如打开一个GBK编码的中文文本文件,甚至一些非Unicode编码的日文,俄文等. Qt提供了QTextCodec类用于不同编码格式之间的转换.关于Qt字符串格式转换以及QTextCodec的使用方式,网上有很多资料.其中大多数看起来很复杂,甚至根本无法完成转换工作,或者是基于较低的Qt版本编写.因此,有必要对使用QTextCodec完成字符串格式转换进行简要说明,本文中代码基于Qt5.1编写. 其实,在Qt帮助

单词统计:对程序设计语言源文件统计字符数、单词数、行数,统计结果以指定格式输出到默认文件中

项目地址:https://gitee.com/loyal888/WordCount 一.工具篇   1.1 IDEA+gitee+git       方便push和增加开发效率,自从用了idea,不可能用eclipse,这辈子都不可能了!      Let's do it! 1.1.1 安装idea gitee插件 http://git.mydoc.io/?t=153739 1.2 下载ar2exe(用于将jar包生成exe文件) 文件下载地址:https://down8.3987.com/20

RTP协议全解析(H264码流和PS流)

目录(?)[+] RTP Header解析 RTP荷载H264码流 1单个NAL单元包 2分片单元FU-A RTP荷载PS流 1PS包头 2系统标题 3节目映射流 4PES分组头部 写在前面:RTP的解析,网上找了很多资料,但是都不全,所以我力图整理出一个比较全面的解析, 其中借鉴了很多文章,我都列在了文章最后,在此表示感谢. 互联网的发展离不开大家的无私奉献,我决定从我做起,希望大家支持. 原创不易,转载请附上链接,谢谢http://blog.csdn.net/chen495810242/ar

H264码流中SPS PPS详解<转>

转载地址:https://zhuanlan.zhihu.com/p/27896239 1 SPS和PPS从何处而来? 2 SPS和PPS中的每个参数起什么作用? 3 如何解析SDP中包含的H.264的SPS和PPS串? 1 客户端抓包 在做客户端视频解码时,一般都会使用Wireshark抓包工具对接收的H264码流进行分析,如下所示: 在这里我们可以看到对解码视频起关键作用的SPS和PPS. 双击SPS内容如下: 双击PPS内容如下: 那么从上面的sps中我们知道图像的宽,高. 宽=(19+1

多媒体文件格式(一):MP4 格式

在互联网常见的格式中,跨平台最好的应该就属MP4文件了.因为MP4文件既可以在PC平台的Flashplayer中播放,又可以在移动平台的Android.iOS等平台中进行播放,而且使用系统默认的播放器即可以播放. MP4格式是最常见的多媒体文件格式. 一.MP4 格式标准介绍 MP4格式标准为ISO-14496 Part 12.ISO-14496 Part 14,标准内容不是很多,下面我们来介绍一下格式标准中一些重要的信息. MP4是一种描述较为全面的容器格式,被认为可以在其中嵌入任何形式的数据

腾讯qlv视频转为MP4格式工具

本文解决上一篇<优酷爱奇艺视频转换为MP4格式工具>留下的腾讯视频qlv转MP4格式问题,教程都是一步步亲手操作的,每一步都有配图.希望各位老板多转发分享,谢谢! 解压软件.(建议关闭所有杀毒软件避免误伤,软件本身无毒无广告,请放心使用) 安装去广告版的腾讯视频.(说明:因为腾讯视频版本变动,码率会随机,下载的视频无法转码,或者转码后的文件会出现不确定的问题,所以请安装去广告版腾讯视频.) 安装完成后,用去广告版腾讯视频下载视频文件. 视频文件下载完成后,右击转换工具以管理员身份运行软件. 添