嵌入式 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硬编码时会比较麻烦一点。
嵌入式 H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流的更多相关文章
- [转]【流媒體】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流
[流媒體]H264—MP4格式及在MP4文件中提取H264的SPS.PPS及码流 SkySeraph Apr 1st 2012 Email:skyseraph00@163.com 一.MP4格式基本 ...
- 多媒体开发之---H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流
一.MP4格式基本概念 MP4格式对应标准MPEG-4标准(ISO/IEC14496) 二.MP4封装格式核心概念 1 MP4封装格式对应标准为 ISO/IEC 14496-12(信息技术 视听对象 ...
- [SimplePlayer] 4. 从视频文件中提取音频
提取音频,具体点来说就是提取音频帧.提取方法与从视频文件中提取图像的方法基本一样,这里仅列出其中的不同点: 1. 由于目的提取音频,因此在demux的时候需要指定的是提取audio stream Au ...
- 利用ROS工具从bag文件中提取图片
bag文件是ROS常用的数据存储格式,因此要从bag文件中提取数据就需要了解一点ROS的背景知识. 1. 什么是ROS及其优势 ROS全称Robot Operating System,是BSD-lic ...
- 使用Python从PDF文件中提取数据
前言 数据是数据科学中任何分析的关键,大多数分析中最常用的数据集类型是存储在逗号分隔值(csv)表中的干净数据.然而,由于可移植文档格式(pdf)文件是最常用的文件格式之一,因此每个数据科学家都应该了 ...
- [数据科学] 从csv, xls文件中提取数据
在python语言中,用丰富的函数库来从文件中提取数据,这篇博客讲解怎么从csv, xls文件中得到想要的数据. 点击下载数据文件http://seanlahman.com/files/databas ...
- 从ROS bag文件中提取图像
从ROS bag文件中提取图像 创建launch文件,如下: export.launch <launch> <node pkg="rosbag" type=&qu ...
- JSFinder:一个在js文件中提取URL和子域名的脚本
JSFinder介绍 JSFinder是一款用作快速在网站的js文件中提取URL,子域名的脚本工具. 支持用法 简单爬取 深度爬取 批量指定URL/指定JS 其他参数 以往我们子域名多数使用爆破或DN ...
- 如何使用JMeter从文件中提取数据
在性能测试方面,重用响应数据至关重要.几乎(如果不是全部!)负载测试场景假设您: 从先前的响应中提取有趣的方面,并在下一个请求中重用它们(也称为相关) 确保实际响应符合预期(又称断言) 因此,如果您是 ...
随机推荐
- 获取手机的UUID
获取手机的UUID 01 连接手机到电脑 02 - 在XCOde中,选择Window->Devices
- TPaintBox的前世今生
TPaintBox是一个图形控件,继承于TGraphicControl,并且只有聊聊几个函数和属性,主要就是Canvas和Paint函数,都在这里了: TPaintBox = class(TGraph ...
- 纯js实现瀑布流布局及ajax动态新增数据
本文用纯js代码手写一个瀑布流网页效果,初步实现一个基本的瀑布流布局,以及滚动到底部后模拟ajax数据加载新图片功能. 缺点: 1. 程序不是响应式,不能实时调整页面宽度: 2. 程序中当新增ajax ...
- 将web项目deploy到tomcat的方法
如果已经把整个项目发布到tomcat的webapps文件夹下,就不用再配置tomcat的server.xml了(也就是不用配置<Context>节点) 并且,你的项目的WEB-INF/li ...
- USACO Section 4.2: Drainage Ditches
最大流的模板题 /* ID: yingzho1 LANG: C++ TASK: ditch */ #include <iostream> #include <fstream> ...
- Zend13.0 +XAMPP3.2.2 调试配置
Zend 调试PHP有3种方式: (1)PHP CLI APPLICATION (2)PHP Web Application (3)PHP UnitTest (1).(2)两种方式配置相似,下图是配置 ...
- 甲骨文推出MySQL Fabric,简化MySQL的高可用性与可扩展性
北京,2014年5月28日——为了满足当下对Web及云应用需求,甲骨文宣布推出MySQL Fabric.MySQL Fabric是一款可简化管理MySQL数据库群的整合式系统.该产品通过故障检测和故障 ...
- 3.cadence创建元器件
1.打开OrCAD Capture 然后可以新建工程,也可以直接建library (打开 后 选择:OrCAD Capture CIS) 背景颜色 Options > Preferences ...
- dotfuscator初步
从此链接下载的http://www.uzzf.com/soft/85836.html 1.安装之前,先去控制面板将VS自带的dotfuscator卸载掉 2.关闭360安全卫士 3.安装下载的程序 安 ...
- leetcode:Merge Two Sorted Lists(有序链表的归并)
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...