一、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 相关资料和工具在文中链接下载

http://www.52rd.com/Blog/wqyuwss/559/4/

http://blog.csdn.net/szu030606/article/details/5943279

http://blog.csdn.net/k1988/article/details/5654631

http://www.cppblog.com/czanyou/archive/2008/11/26/67940.html

http://krdai.info/blog/sps-pps-in-mp4-format.html

http://www.cnitblog.com/zouzheng/archive/2007/04/04/25155.html

http://bbs.chinavideo.org/viewthread.php?tid=10273

【VS开发】MP4与H.264的更多相关文章

  1. (转载)H.264码流的RTP封包说明

    H.264的NALU,RTP封包说明(转自牛人) 2010-06-30 16:28 H.264 RTP payload 格式 H.264 视频 RTP 负载格式 1. 网络抽象层单元类型 (NALU) ...

  2. 让dcef3支持mp3和h.264 mp4解码播放

    嵌入式Chromium框架(简称CEF) 是一个由Marshall Greenblatt在2008建立的开源项目,它主要目的是开发一个基于Google Chromium的Webbrowser控件.CE ...

  3. Android IOS WebRTC 音视频开发总结(七九)-- WebRTC选择H.264的四大理由

    本文主要介绍WebRTC选择H.264的理由(我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacke ...

  4. 屏幕录制H.264视频,AAC音频,MP4复,LibRTMP现场活动

    上周完成了一个屏幕录制节目,实时屏幕捕获.记录,视频H.264压缩,音频应用AAC压缩,复用MP4格公式,这使得计算机和ios设备上直接播放.支持HTML5的播放器都能够放,这是标准格式的优点.抓屏也 ...

  5. 直播平台搭建之音视频开发:认识主流视频编码技术H.264

    H.264简介 什么是H.264?H.264是一种高性能的视频编解码技术.目前国际上制定视频编解码技术的组织有两个,一个是"国际电联",它制定的标准有H.261.H.263.H.2 ...

  6. x264 - 高品质 H.264 编码器

    转自:http://www.5i01.cn/topicdetail.php?f=510&t=3735840&r=18&last=48592660 H.264 / MPEG-4 ...

  7. H.264开源解码器评测

    转自:http://wmnmtm.blog.163.com/blog/static/38245714201142883032575/ 要播放HDTV,就首先要正确地解开封装,然后进行视频音频解码.所以 ...

  8. 【图像处理】H.264开源解码器评测

    转自:http://wmnmtm.blog.163.com/blog/static/38245714201142883032575/ 要播放HDTV,就首先要正确地解开封装,然后进行视频音频解码.所以 ...

  9. ASP.NET MVC程序播放H.264视频

    在这篇之前,Insus.NET不管是在ASP.NET还是ASP.NET MVC实现很多视频播放,你可以参考这篇链接:http://www.cnblogs.com/insus/category/4650 ...

随机推荐

  1. python中的几种数据类型(一)

    一.整型(数字)      python2中有长整形long      python3 中全都是整型 int n = 56 print(n.bit_length()) # 0011 1000 # 12 ...

  2. python自动华 (十四)

    Python自动化 [第十四篇]:HTML介绍 本节内容: Html 概述 HTML文档 常用标签 2. CSS 概述 CSS选择器 CSS常用属性 1.HTML 1.1概述 HTML是英文Hyper ...

  3. npm install命令

    1. --save-prod/-P 使用该命令后,会在package.json的dependencies中出现,是生产环境依赖: 该命令是默认命令. npm install react // 等同于 ...

  4. KiCad:Cursor Ghosting

    造冰箱的大熊猫@cnblogs 2019/8/11 装下KiCad学习下,结果鼠标在界面上划过时,留下一串鼠标残影,原来英文管这个叫“cursor ghosting”. 解决方法:依旧粗暴简单,从官网 ...

  5. CF55D Beautiful numbers (数位dp)

    题目链接 题解 一个数能被一些数整除,那么一定被这些数的\(lcm\)整除 那么我们容易想到根据\(lcm\)设状态 我们可以发现有用的\(lcm\)只有\(48\)个 那么按照一般的数位\(dp\) ...

  6. mysql 进程

    --------------------查看mysql所有进程-----------show full processlist -------------------查看mysql 账号权限----- ...

  7. UVALive 4726 Average ——(斜率优化DP)

    这是第一次写斜率优化DP= =.具体的做法参照周源论文<浅谈数形结合思想在信息学竞赛中的应用>.这里仅提供一下AC的代码. 有两点值得注意:1.我这个队列的front和back都是闭区间的 ...

  8. 2018-2019-2 20165210《网络对抗技术》Exp8 Web基础

    2018-2019-2 20165210<网络对抗技术>Exp8 Web基础 实验内容: Web前端HTML 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法 ...

  9. 【Linux】安装 node.js

    1.在 linux 上安装 node.js 有几种方式,这里 教的是最简单的一种,因为其他都比较坑. 2.先去 node.js 官网 获取到已经编译好的安装包的地址, 3.使用 wget 去下载上面获 ...

  10. Async and Await (Stephen Cleary)

    https://blog.stephencleary.com/2012/02/async-and-await.html Most people have already heard about the ...