1. mp4
- 1. mp4
- 1.1. 简介
- 1.2. ftyp
- 1.3. moov
- 1.4. moov-mvhd
- 1.5. moov-trak
- 1.6. trak-tkhd
- 1.7. trak-mdia
- 1.8. mdia-mdhd
- 1.9. mdia-hdlf
- 1.10. mdia-minf
- 1.11. minf-vmhd
- 1.12. minf-smhd
- 1.13. minf-dinf
- 1.14. minf-dinf-dref
- 1.15. minf-stbl(最复杂的一个)
- 1.16. stbl-stsd
- 1.17. stbl-stsd-mp4a
- 1.18. stbl-stts(dts)
- 1.19. stbl-ctts(pts-dts)
- 1.20. stbl-stsz/stz2(sample大小)
- 1.21. stbl-stsc(sample/chunk)
- 1.22. stbl-stco/co64(check offset)
1.1. 简介
-
MP4的全称:MPEG4-14,一种是用MPEG4多媒体档案格式,文件的后缀名“.MP4”。
-
最开始MP4是指音频(MP3的升级),即MPEG2 AAC标准。随后MP4的概念被转移到视频上,对应的是MPEG4。
-
现在MP4文件格式适应各种媒体数据,可以在平台和终端上播放。同时MP4文件可以用来描述几乎所有的媒体结构。
-
是一种面向对象的,以节点为基础的树形存储数据的文件结构。它采用了QT文件的基本格式 。
-
优点
- MP4文件可以在各种平台和终端使用常用的播放器上播放。
- MP4文件格式扩展性比加强,几乎可以用来描述所有的媒体结构。
- MP4文件所需的空间更小。
- MP4文件的meta data 和media data可以分为两个文件存放。
- MP4文件不仅可以在本地播放,而且可以通过RTP/RTCP等流化协议将MP4的音视频数据进行流化,在网络上进行点播。
- MP4的媒体描述信息比较多,各种信息比较全。
- MP4文件支持两个以上音频流或者视频流存储。
-
缺点
- MP4文件结构比较复杂,增加了编程处理的难度。
- hint track 和 media track 耦合度高。
- 先写完子box,才能确定父box的相关信息,在实时存储时,一旦发生异常文件损坏。
- MP4文件不易修复。
- 非线编软件不能直接编辑MP4文件。
-
ISO/IEC 14496标准,ISO/IEC 14496是MPEG专家组制定的MPEG-4标准,分为多个部分(仍在更新)。参考:https://en.wikipedia.org/wiki/Category:ISO/IEC_14496
- 第一部分(ISO/IEC 14496-1):系统:描述视频和音频数据流的控制、同步以及混合方式(即混流Multiplexing,简写为MUX)。
- 第二部分(ISO/IEC 14496-2):视频:定义一个对各种视觉信息(包括自然视频、静止纹理、计算机合成图形等等)的编解码器。(例如XviD编码就属于MPEG-4 Part 2)
- 第三部分(ISO/IEC 14496-3):音频:定义一个对各种音频信号进行编码的编解码器的集合。包括高级音频编码(Advanced Audio Coding,缩写为AAC)的若干变形和其他一些音频/语音编码工具。
- 第四部分(ISO/IEC 14496-4):一致性:定义对本标准其他的部分进行一致性测试的程序。
- 第五部分(ISO/IEC 14496-5):参考软件:提供用于演示功能和说明本标准其他部分功能的软件。
- 第六部分(ISO/IEC 14496-6):多媒体传输集成框架(DMIF for Delivery Multimedia Integration Framework)
- 第七部分(ISO/IEC 14496-7):优化的参考软件:提供对实现进行优化的例子(这里的实现指的是第五部分)。
- 第八部分(ISO/IEC 14496-8):在IP网络上传输:定义在IP网络上传输MPEG-4内容的方式。
- 第九部分(ISO/IEC 14496-9):参考硬件:提供用于演示怎样在硬件上实现本标准其他部分功能的硬件设计方案。
- 第十部分(ISO/IEC 14496-10):高级视频编码或称高级视频编码(Advanced Video Coding,缩写为AVC):定义一个视频编解码器(codec)。AVC和XviD都属于MPEG-4编码,但由于AVC属于MPEG-4 Part 10,在技术特性上比属于MPEG-4 Part2的XviD要先进。另外,它和ITU-T H.264标准是一致的,故又称为H.264。
- 第十二部分(ISO/IEC 14496-12):基于ISO的媒体文件格式:定义一个存储媒体内容的文件格式。moof定义在这里。
- 第十三部分(ISO/IEC 14496-13):知识产权管理和保护(IPMP for Intellectual Property Management and Protection)拓展。
- 第十四部分(ISO/IEC 14496-14):MPEG-4文件格式:定义基于第十二部分的用于存储MPEG-4内容的视频文件格式。
- 第十五部分(ISO/IEC 14496-15):AVC文件格式:定义基于第十二部分的用于存储第十部分的视频内容的文件格式。
- 第十六部分(ISO/IEC 14496-16):动画框架扩展(AFX : Animation Framework eXtension)。
- 第十七部分(ISO/IEC 14496-17):同步文本字幕格式。
- 第十八部分(ISO/IEC 14496-18):字体压缩和流式传输(针对开放字体格式Open Font Format)。
- 第十九部分(ISO/IEC 14496-19):合成材质流(Synthesized Texture Stream)。
- 第二十部分(ISO/IEC 14496-20):简单场景表示(LASeR for Lightweight Scene Representation。
- 第二十一部分(ISO/IEC 14496-21):用于描绘(Rendering)的MPEG-J拓展。
- 第二十二部分(ISO/IEC 14496-22):开放字体格式(Open Font Format)。
- 第二十三部分(ISO/IEC 14496-23):符号化音乐表示(Symbolic Music Representation)。
- 第二十四部分(ISO/IEC 14496-24):音频与系统交互作用(Audio and systems interaction)。
- 第二十五部分(ISO/IEC 14496-25):3D图形压缩模型(3D Graphics Compression Model)。
- 第二十六部分(ISO/IEC 14496-26):音频一致性检查:定义测试音频数据与ISO/IEC 14496-3是否一致的方法(Audio conformance)。
- 第二十七部分(ISO/IEC 14496-27):3D图形一致性检查:定义测试3D图形数据与ISO/IEC 14496-11:2005, ISO/IEC 14496-16:2006, ISO/IEC 14496-21:2006,和ISO/IEC 14496-25:2009是否一致的方法(3D Graphics conformance)。
- qtff-2001:QuickTime file format;
MP4是在“ISO/IEC 14496-14”标准文件中定义的一种多媒体容器格式,它是MPEG4 (ISO/IEC 14496)标准的一部分。是“ISO/IEC 14496-12(MPEG-4 Part 12 ISO base media file format)”标准中所定义的媒体格式的一种实现。
-
概念
- track 表示一些sample的集合,对于媒体数据来说,表示一个视频或者音频序列
- sample 对于video track来说,sample为一帧视频图像,或者一组连续的视频帧。对应audio sample,为一段压缩的音频。不可能有两个或者多个sample具有相同的时间戳。
- chunk 一个track的几个连续sample组成的单元称为一个chunk,同一chunk内的sample是连续的。
-
结构
- MP4文件中的数据主要分成两部分:meta data和media data。这两种数据在MP4文件中是分开进行存储的 。
- media data实际的音视频编码数据或者采样数据,例如视频帧,或者一个音频sample。 解码的入口单元
- Meta data元数据用于描述media data
- MP4文件的基本数据存储单元。在QuickTime中称之为Atom。MP4文件中所有的数据都封装在Box中,也就是说MP4文件是由若干个Box组成。
- 每一个Box除了它本身的数据以外,还包含Box的大小和类型信息。Box中数据采用big-endian(network)进行存储。
- MP4文件,由许多 Box 和 FullBox 组成。
- Box,每个 Box 由 Header 和 Data 组成。
- FullBox,是 Box 的扩展,Box 结构的基础上在 Header 中增加 8bits version 和 24bits flags。
- Header,包含了整个 Box 的长度 size 和类型 type。
- 当 size==0 时,代表这是文件中最后一个 Box;
- 当 size==1 时,意味着 Box 长度需要更多 bits 来描述,在后面会定义一个 64bits 的 largesize 描述 Box 的长度;
- 当 type 是 uuid 时,代表 Box 中的数据是用户自定义扩展类型。
- Data,是 Box 的实际数据,可以是纯数据也可以是更多的子 Boxes。
- 当一个 Box 的 Data 中是一系列子 Box 时,这个 Box 又可成为 Container Box。
- 最主要的box是moov,视频元数据
- MP4文件中的数据主要分成两部分:meta data和media data。这两种数据在MP4文件中是分开进行存储的 。
Box的结构用伪代码表示如下
aligned(8) class Box (unsigned int(32) boxtype,optional unsigned int(8)[16] extended_type)
{
{ // Header
unsigned int(32) size;
unsigned int(32) type = boxtype;
if (size==1) {
unsigned int(64) largesize;
} else if (size==0) {
// box extends to end of file
}
if (boxtype==‘uuid’) {
unsigned int(8)[16] usertype = extended_type;
}
}
char* pData;
}
文件基本结构描述图(打对勾的标识必须具备的box,不可省略)
精简版本
- ftyp √ 文件类型,内容固定
- moov √ 元数据metadata的信息box
- mvhd √ moov头信息,包含时长(不准确)
- trak √ 流数据容器,文件有多个track(video/audio/hint等)
- tkhd √ track header 关于track的信息,包括时长、宽高
- mdia √ 媒体box,包含媒体详细信息,描述track的媒体类型和sample data
- mdhd √ media header 媒体信息综述,时长,采样率等
- hdlr √ 媒体的播放过程信息,定义具体类型:video/audio/hint
- minf √ media information 容器
- vmhd video media header , overall information (video track only)
- smhd sound media header , overall information (sound track only)
- stbl √ sample table box, sample所有时间和位置的信息,以及sample的编解码等信息。利用这个表,可以解释sample的时序、类型、大小以及在各自存储容器中的位置
- stsd √ sample descriptions 详细的编码信息和解码初始化信息
- mp4a aac
- avc1 h264
- esds mpeg4
- hvcc h265
- stts √ pts映射表,(decoding) time-to-sample
- ctts dts映射表,(composition) time to sample
- stsc √ sample/chunk映射表,sample-to-chunk, partial data-offset information
- stsz sample大小,sample size (framing)
- stz2 sample大小,compact sample sizes (framing)
- stco √ 每个chunk在文件中的位置,chunk offset, partial data-offset information
- co64 每个chunk在文件中的位置,64-bit chunk offset
- stsd √ sample descriptions 详细的编码信息和解码初始化信息
- mdat media data container 可以有多个,也可以没有,用来存储媒体数据。
复杂版本
- ftyp √ 文件类型,内容固定
- pdin progressive download information
- moov √ 元数据metadata的信息box
- mvhd √ moov头信息,包含时长(不准确)
- trak √ 流数据容器,文件有多个track(video/audio/hint等)
- tkhd √ track header 关于track的信息,包括时长、宽高
- tref 定义tracks之间的关联关系,定义本身这个track如何关联到其他的track上
- edts edit list container
- elst an edit list
- mdia √ 媒体box,包含媒体详细信息,描述track的媒体类型和sample data
- mdhd √ media header 媒体信息综述,时长,采样率等
- hdlr √ 媒体的播放过程信息,定义具体类型:video/audio/hint
- minf √ media information 容器
- vmhd video media header , overall information (video track only)
- smhd sound media header , overall information (sound track only)
- hmhd hint media header, overall information (hint track only)
- nmhd Null media header, overall information (some tracks only)
- dinf √ media information 定位box,通过url来指定数据(数据可以不在本文件内)
- dref √ url,指定数据位置,当数据被完全包含在文件中时,“url”或“urn”中的定位字符串是空的
- stbl √ sample table box, sample所有时间和位置的信息,以及sample的编解码等信息。利用这个表,可以解释sample的时序、类型、大小以及在各自存储容器中的位置
- stsd √ sample descriptions 详细的编码信息和解码初始化信息
- mp4a
- esds
- avc1 h264
- esds mpeg4
- hvcc h265
- mp4a
- stts √ pts映射表,(decoding) time-to-sample
- ctts dts映射表,(composition) time to sample
- stsc √ sample/chunk映射表,sample-to-chunk, partial data-offset information
- stsz sample大小,sample size (framing)
- stz2 sample大小,compact sample sizes (framing)
- stco √ 每个chunk在文件中的位置,chunk offset, partial data-offset information
- co64 每个chunk在文件中的位置,64-bit chunk offset
- stss 这个box确定media中的关键帧,如果此表不存在,说明每一个sample都是一个关键帧,是一个随机存取点。
- stsh shadow sync sample table
- padb sample padding bits
- stdp sample degradation priority
- sdtp independent and disposable samples
- sbgp sample-to-group
- sgpd sample group description
- subs sub-sample information
- stsd √ sample descriptions 详细的编码信息和解码初始化信息
- mvex movie extends box
- mehd movie extends header box
- trex √ track extends defaults
- ipmc IPMP Control Box
- moof movie fragment
- mfhd √ movie fragment header
- traf track fragment
- tfhd √ track fragment header
- trun track fragment run
- sdtp independent and disposable samples
- sbgp sample-to-group
- subs sub-sample information
- mfra movie fragment random access
- tfra track fragment random access
- mfro √ movie fragment random access offset
- mdat media data container 可以有多个,也可以没有,用来存储媒体数据。
- free free space “free”中的内容是无关紧要的,可以被忽略。该box被删除后,不会对播放产生任何影响。
- skip free space
- udta user-data 声明一些和它的container box或者media data相关的用户信息,用户信息也是通过box的形式来表现。
- cprt copyright etc.
- udta user-data 声明一些和它的container box或者media data相关的用户信息,用户信息也是通过box的形式来表现。
- meta metadata
- hdlr √ handler, declares the metadata (handler) type
- dinf data information box, container
- dref data reference box, declares source(s) of metadata items
- ipmc IPMP Control Box
- iloc item location
- ipro item protection
- sinf protection scheme information box
- frma original format box
- imif IPMP Information box
- schm scheme type box
- schi scheme information box
- sinf protection scheme information box
- iinf item information
- xml XML container
- bxml binary XML container
- pitm primary item reference
- fiin file delivery item information
- paen partition entry
- fpar file partition
- fecr FEC reservoir
- segr file delivery session group
- gitn group id to name
- tsel track selection
- paen partition entry
- meco additional metadata container
- mere metabox relation
1.2. ftyp
- File Type Box 该 box 有且只有1个,并且只能被包含在文件层,而不能被其他box包含。
- 该box应该被放在文件的最开始,指示该MP4文件应用的相关信息。
- 类型为“ftyp”
字段 | 字节数 | 意义 | 实例 |
---|---|---|---|
box size | 4 | box大小 | 00 00 00 18 |
box type | 4 | box类型 | 66 74 79 70 |
major brand | 4 | 6D 70 34 32 | |
minor version | 4 | 00 00 00 01 | |
compatible brands | 4*n | 6D 70 34 32 6D 70 34 31 |
1.3. moov
- 该box包含了文件媒体的 metadata 信息,“moov” 是一个 container box,具体内容信息由子 box 诠释。
- 该box有且只有一个,且只被包含在文件层。一般情况下,“moov”会紧随“ftyp”出现。
- 一般情况下,“moov”中会包含1个“mvhd”和若干个“trak”。
- 其中“mvhd”为header box,一般作为“moov”的第一个子box出现(对于其他container box来说,header box都应作为首个子box出现)。
- “trak”包含了一个track的相关信息,是一个container box。
- moov √ container for all the metadata
- mvhd √ movie header, overall declarations
- trak √ container for an individual track or stream
字段 | 字节数 | 意义 | 实例 |
---|---|---|---|
box size | 4 | box大小 | 00 00 5A EB |
box type | 4 | box类型moov | 6D 6F 6F 76 |
1.4. moov-mvhd
- moov的头box
字段 | 字节数 | 意义 | 实例 |
---|---|---|---|
box size | 4 | box大小 | 00 00 00 6C |
box type | 4 | box类型 | 6D 76 68 64 |
version | 1 | box版本,0或1,一般为0。(以下字节数均按version=0) | 00 |
flags | 3 | 00 00 00 | |
creation time | 4 | 创建时间(相对于UTC时间1904-01-01零点的秒数) | BE 44 3F 8D |
modification time | 4 | 修改时间 | BE 44 3F 8D |
time scale | 4 | 文件媒体在1秒时间内的刻度值,可以理解为1秒长度的时间单元数。频率或者采样率。 | 00 00 02 58 |
duration | 4 | 该track的时间长度,用duration和time scale值可以计算track时长(单位:秒),比如audio track的time scale = 8000, duration = 560128,时长为70.016,video track的time scale = 600, duration = 42000,时长为70 | 00 00 A4 10 |
rate | 4 | 推荐播放速率,高16位和低16位分别为小数点整数部分和小数部分,即[16.16] 格式,该值为1.0(0x00010000)表示正常前向播放 | 00 01 00 00 |
volume | 2 | 与rate类似,[8.8] 格式,1.0(0x0100)表示最大音量 | 01 00 |
reserved | 10 | 保留位 | 00 00 00 00 00 00 00 00 00 00 |
matrix | 36 视频变换矩阵 | ||
pre-defined | 24 | ||
next track id | 4 | 下一个track使用的id号 | 00 00 00 05 |
1.5. moov-trak
-
“trak”也是一个 container box,其子 box 包含了该 track 的媒体数据引用和描述(hint track除外)。
-
一个MP4文件中的媒体可以包含多个track,且至少有一个track,这些track之间彼此独立,有自己的时间和空间信息。
-
“trak”必须包含一个“tkhd”和一个“mdia”,此外还有很多可选的box(略)。
-
其中“tkhd”为track header box,“mdia”为media box,该box是一个包含一些track媒体数据信息box的container box。
-
trak √ container for an individual track or stream
- tkhd √ track header, overall information about the track
- mdia √ container for the media information in a track
- mdhd √ media header, overall information about the media
- hdlr √ handler, declares the media (handler) type
- minf √ media information container
- vmhd video media header, overall information (video track only)
- smhd sound media header, overall information (sound track only)
- dinf √ data information box, container
- dref √ data reference box, declares source(s) of media data in track
- stbl √ sample table box, container for the time/space map
- stsd √ sample descriptions (codec types, initialization etc.)
- stts √ (decoding) time-to-sample
- ctts (composition) time to sample
- stsc √ sample-to-chunk, partial data-offset information
- stsz sample sizes (framing)
- stz2 compact sample sizes (framing)
- stco √ chunk offset, partial data-offset information
- co64 64-bit chunk offset
- stss sync sample table (random access points)
1.6. trak-tkhd
- trak的头。
- 音频的(通过音频字段判断)
字段 | 字节数 | 意义 | 实例 |
---|---|---|---|
box size | 4 | box大小 | 005C |
box type | 4 | box类型 | 74 6B 68 64 |
version | 1 | box版本,0或1,一般为0。(以下字节数均按version=0) | 00 |
flags | 3 | 按位或操作结果值,预定义如下:;0x000001 track_enabled,否则该track不被播放;0x000002 track_in_movie,表示该track在播放中被引用;0x000004 track_in_preview,表示该track在预览时被引用。一般该值为7,如果一个媒体所有track均未设置track_in_movie和track_in_preview,将被理解为所有track均设置了这两项;对于hint track,该值为 0 | 00 00 01 |
creation time | 4 | 创建时间(相对于UTC时间1904-01-01零点的秒数) | BE 44 3F 8C |
modification time | 4 | 修改时间 | BE 44 3F 8D |
track id | 4 | id号,不能重复且不能为0 | 00 00 00 01 00 00 00 02 00 00 00 03 00 00 00 04 |
reserved | 4 | 保留位 | 00 00 00 00 |
duration | 4 | track的时间长度 参见mvhd的duration | 00 00 A4 10 |
reserved | 8 | 保留位 | 00 00 00 00 00 00 00 00 |
layer | 2 | 视频层,默认为0,值小的在上层 | 00 00 |
alternate group | 2 | track分组信息,默认为0表示该track未与其他track有群组关系 | 00 00 |
volume | 2 | [8.8] 格式,如果为音频track,1.0(0x0100)表示最大音量;否则为0 | 01 00 00 00 00 00 00 00 |
reserved | 2 | 保留位 00 00 | |
matrix | 36 | 视频变换矩阵 00 01 00 00 … 40 00 00 00 | |
width | 4 | 宽 | 00 00 00 00 00 0C 00 00 00 00 00 00 00 00 00 00 |
height | 4 | 高,均为 [16.16] 格式值,与sample描述中的实际画面大小比值,用于播放时的展示宽高 | 00 00 00 00 00 F2 00 00 00 00 00 00 00 00 00 00 |
1.7. trak-mdia
- “mdia”也是个container box,其子box的结构和种类还是比较复杂的。先来看一个“mdia”的实例结构树图。
- 总体来说,“mdia”定义了track媒体类型以及sample数据,描述sample信息。
- 一般“mdia”包含一个“mdhd”,一个“hdlr”和一个“minf”
- 其中“mdhd”为media header box
- “hdlr”为handler reference box,
- “minf”为media information box。
1.8. mdia-mdhd
字段 | 字节数 | 意义 | 实例 |
---|---|---|---|
box size | 4 | box大小 | 00 00 00 20 |
box type | 4 | box类型 | 6D 64 68 64 |
version | 1 | box版本,0或1,一般为0。(以下字节数均按version=0) | 00 |
flags | 3 | 00 00 00 | |
creation time | 4 | 创建时间(相对于UTC时间1904-01-01零点的秒数) | BE 44 3F 8D |
modification time | 4 | 修改时间 | BE 44 3F 8D |
time scale | 4 | 采样率 | 00 00 1F 40//8000 |
duration | 4 | track的时间长度, 560128/8000=70s(音频时长) | 00 08 8C 00//560128 |
language | 2 | 媒体语言码。最高位为0,后面15位为3个字符(见ISO 639-2/T标准中定义) | 15 C7 |
pre-defined | 2 | 00 00 |
1.9. mdia-hdlf
- “hdlr”解释了媒体的播放过程信息。
- 定义track类型(video/audio/hint)
字段 | 字节数 | 意义 | 实例 |
---|---|---|---|
box size | 4 | box大小 | 00 00 00 3A |
box type | 4 | box类型 | 68 64 6C 72 |
version | 1 | box版本,0或1,一般为0。(以下字节数均按version=0) | 00 |
flags | 3 | ||
pre-defined | 4 | ||
handler type | 4 | 在media box中,该值为4个字符:“vide”— video track;“soun”— audio track;“hint”— hint track | 73 6F 75 6E(soun) 76 69 64 65(vide) 68 69 6E 74(hint) |
reserved | 12 | 00 00 00 00 00 00 00 00 00 00 00 00 | |
name | 不定 | track type name,以‘\0’结尾的字符串 | 41 70 70 6C…6C 65 72 00 Apple Sound Media Hander |
1.10. mdia-minf
-
minf”存储了解释track媒体数据的handler-specific信息
-
media handler用这些信息将媒体时间映射到媒体数据并进行处理。
-
“minf”中的信息格式和内容与媒体类型以及解释媒体数据的media handler密切相关
-
其他media handler不知道如何解释这些信息。“minf”是一个container box,其实际内容由子box说明。
-
一般情况下,“minf”包含一个header box,一个“dinf”和一个“stbl”,
- header box根据track type(即media handler type)分为“vmhd”、“smhd”、“hmhd”和“nmhd”,
- “dinf”为data information box,
- “stbl”为sample table box。
-
minf √ media information container
- vmhd video media header, overall information (video track only)
- smhd sound media header, overall information (sound track only)
- hmhd hint media header, overall information (hint track only)
- nmhd Null media header, overall information (some tracks only)
- dinf √ data information box, container
- dref √ data reference box, declares source(s) of media data in track
- stbl √ sample table box, container for the time/space map
- stsd √ sample descriptions (codec types, initialization etc.)
- stts √ (decoding) time-to-sample
- ctts (composition) time to sample
- stsc √ sample-to-chunk, partial data-offset information
- stsz sample sizes (framing)
- stz2 compact sample sizes (framing)
- stco √ chunk offset, partial data-offset information
- co64 64-bit chunk offset
- stss sync sample table (random access points)
- stsh shadow sync sample table
- padb sample padding bits
- stdp sample degradation priority
- sdtp independent and disposable samples
- sbgp sample-to-group
- sgpd sample group description
- subs sub-sample information
1.11. minf-vmhd
字段 | 字节数 | 意义 | 实例 |
---|---|---|---|
box size | 4 | box大小 | 00 00 00 14 |
box type | 4 | box类型 | 76 6D 68 64 |
version | 1 | box版本,0或1,一般为0。(以下字节数均按version=0) | 00 |
flags | 3 | ||
graphics mode | 2 | 视频合成模式,为0时拷贝原始图像,否则与opcolor进行合成 | 00 00 |
opcolor | 2×3 | {red,green,blue} | 00 00 00 00 00 00 |
1.12. minf-smhd
字段 | 字节数 | 意义 | 实例 |
---|---|---|---|
box size | 4 | box大小 | 00 00 00 10 |
box type | 4 | box类型 | 73 6D 68 64 |
version | 1 | box版本,0或1,一般为0。(以下字节数均按version=0) | 00 |
flags | 3 | 00 00 00 | |
balance | 2 | 立体声平衡,[8.8] 格式值,一般为0,-1.0表示全部左声道,1.0表示全部右声道 | 00 00 |
reserved | 2 | 00 00 |
1.13. minf-dinf
- “dinf”解释如何定位媒体信息,是一个container box。
- “dinf”一般包含一个“dref”,即data reference box;“dref”下会包含若干个“url”或“urn”,这些box组成一个表,用来定位track数据。
- 简单的说,track可以被分成若干段,每一段都可以根据“url”或“urn”指向的地址来获取数据,sample描述中会用这些片段的序号将这些片段组成一个完整的track。
- 一般情况下,当数据被完全包含在文件中时,“url”或“urn”中的定位字符串是空的。
1.14. minf-dinf-dref
字段 | 字节数 | 意义 | 实例 |
---|---|---|---|
box size | 4 | box大小 | 00 00 00 1C |
box type | 4 | box类型 | 64 72 65 66 |
version | 1 | box版本,0或1,一般为0。(以下字节数均按version=0) | 00 |
flags | 3 | 00 00 00 | |
entry count | 4 | “url”或“urn”表的元素个数 | 00 00 00 01 |
“url”或“urn”列表 | 不定 | 00 00 00 0V 75 72 6C 20 00 00 00 01 00(url) |
1.15. minf-stbl(最复杂的一个)
-
“stbl”几乎是普通的MP4文件中最复杂的一个box了,首先需要回忆一下sample的概念。
-
sample是媒体数据存储的单位,存储在media的chunk中,chunk和sample的长度均可互不相同。
-
一个Chunk可以包含1个或者多个sample
-
“stbl”包含了关于track中sample所有时间和位置的信息,以及sample的编解码等信息。
-
利用这个表,可以解释sample的时序、类型、大小以及在各自存储容器中的位置。
-
“stbl”是一个container box
-
stbl √ sample table box, container for the time/space map
- stsd √ sample descriptions (codec types, initialization etc.)
- mp4a
- esds
- avc1 h264
- esds mpeg4
- hvcc h265
- mp4a
- stts √ (decoding) time-to-sample
- ctts (composition) time to sample
- stsc √ sample-to-chunk, partial data-offset information
- stsz sample sizes (framing)
- stz2 compact sample sizes (framing)
- stco √ chunk offset, partial data-offset information
- co64 64-bit chunk offset
- stss sync sample table (random access points)
- stsh shadow sync sample table
- padb sample padding bits
- stdp sample degradation priority
- sdtp independent and disposable samples
- sbgp sample-to-group
- sgpd sample group description
- subs sub-sample information
- stsd √ sample descriptions (codec types, initialization etc.)
1.16. stbl-stsd
- sample description box(stsd)“stsd”必不可少,且至少包含一个条目,该box包含了data reference box进行sample数据检索的信息。
- 没有“stsd”就无法计算media sample的存储位置。
- “stsd”包含了编码的信息,其存储的信息随媒体类型不同而不同。
- box header和version字段后会有一个entry count字段,根据entry的个数,每个entry会有type信息,如“vide”、“sund”等,根据type不同sample description会提供不同的信息,例如对于video track,会有“VisualSampleEntry”类型信息,对于audio track会有“AudioSampleEntry”类型信息。
- 视频的编码类型、宽高、长度,音频的声道、采样等信息都会出现在这个box中。
字段 | 字节数 | 意义 | 实例 |
---|---|---|---|
box size | 4 | box大小 | 00 00 00 67 |
box type | 4 | box类型 | 73 74 73 64 |
version | 1 | box版本,0或1,一般为0。(以下字节数均按version=0) | 00 |
flags | 3 | ||
entry count | 4 | Sample descriptons的数目 | 00 00 00 01 |
Sample Description | 不定 | 不同的媒体信息类型(mp4a,mp4v,rtp等)有不同的sample description,但前四个字段是相同的。包括size/type/reserve/data reference见下表 |
1.17. stbl-stsd-mp4a
字段 | 字节数 | 意义 | 实例 |
---|---|---|---|
box size | 4 | box大小 | 00 00 00 57 |
box type | 4 | box类型 | 6D 70 34 61 |
reserve | 6 | 预留 | 00 00 00 00 00 00 |
data reference | 2 | 利用这个索引可以检索与当前sample description关联的数据,数据引用存储在data reference atoms。 | 00 01 |
Other | 不定 | esds等子box |
1.18. stbl-stts(dts)
- time to sample box(stts)
- “stts”存储了sample的duration,描述了sample时序的映射方法,我们通过它可以找到任何时间的sample。
- “stts”可以包含一个压缩的表来映射时间和sample序号,用其他的表来提供每个sample的长度和指针。
- 表中每个条目提供了在同一个时间偏移量里面连续的sample序号,以及samples的偏移量。
- 递增这些偏移量,就可以建立一个完整的time to sample表。
- 计算公式如下:
- DT(n+1) = DT(n) + STTS(n)
- 其中STTS(n)是没有压缩的STTS第n项信息
- DT是第n个sample的是解码时间。
- Sample的排序是按照时间戳的顺序,这样偏移量永远是非负数。
- DT一般以0开始,如果不为0,edit list atom设定初始的DT值。
- DT计算公式如下
- DT(i) = SUM(for = j=0 to i-1 of delta(j))
- 所有偏移量的和就是track中media的长度,这个长度不包括media的time scale,也不包括任何的eidt list。
字段 | 字节数 | 意义 | 实例 |
---|---|---|---|
box size | 4 | box大小 | 00 00 00 18 |
box type | 4 | box类型 | 73 74 74 73 |
version | 1 | box版本,0或1,一般为0。(以下字节数均按version=0) | 00 |
flags | 3 | 00 00 00 | |
count | 4 | time to sample的数目 | 00 00 00 01 |
time to sample | |||
sample count | 4 | 有相同duration的连续sample的数目 | 00 00 02 23 |
sample duration | 4 | 每个sample的duration | 00 00 04 00 |
1.19. stbl-ctts(pts-dts)
- 因为 pts > dts ,所以 ctts 永远大于 0
- composition time = pts
- decode time = dts
1.20. stbl-stsz/stz2(sample大小)
- sample size box(stsz或stz2)
- “stsz” 定义了每个sample的大小,包含了媒体中全部sample的数目和一张给出每个sample大小的表。
- 这个box相对来说体积是比较大的。
字段 | 字节数 | 意义 | 实例 |
---|---|---|---|
box size | 4 | box大小 | 00 00 08 A0 |
box type | 4 | box类型 | 73 74 73 7A |
version | 1 | box版本,0或1,一般为0。(以下字节数均按version=0) | 00 |
flags | 3 | ||
sample size | 4 | 全部sample的数目,如果所有的sample有相同的长度,这个字段就是这个值,否则,这个字段的值就是0.那些字段存在sample size表中 | 00 00 00 00 |
条目数目 | 4 | sample size的数目 | 00 00 02 23(547) |
sample size | 结构,这个表根据sample number索引,第一项就是第一个sample,第二项就是第二个sample | ||
大小 | 4 | 每个sample的大小 | 00 00 00 07 00 00 00 07 00 00 00 07 00 00 01 A6 … 00 00 01 10 |
1.21. stbl-stsc(sample/chunk)
- sample to chunk box(stsc)
- 用chunk组织sample可以方便优化数据获取,一个thunk包含一个或多个sample。
- “stsc”中用一个表描述了sample与chunk的映射关系,查看这张表就可以找到包含指定sample的thunk,从而找到这个sample。
字段 | 字节数 | 意义 | 实例 |
---|---|---|---|
box size | 4 | box大小 | 00 00 02 A4 |
box type | 4 | box类型 | 73 74 73 63 |
version | 1 | box版本,0或1,一般为0。(以下字节数均按version=0) | 00 |
flags | 3 | 00 00 00 | |
条目数目 | 4 | sample to chunk的数目 | 00 00 00 37 |
sample to chunk | sample to chunk表的结构 | ||
First chunk | 4 | 这个table使用的第一个chunk序号 | 00 00 00 01 00 00 00 02 00 00 00 03 … 00 00 01 1C |
Sample pre chunk | 4 | 这个trunk内的sample数目 | 00 00 00 03 00 00 00 01 00 00 00 02 … 00 00 00 02 |
sample description ID | 4 | 与这些sample关联的sample description的序号 | 00 00 00 01 00 00 00 01 00 00 00 01 … 00 00 00 01 |
1.22. stbl-stco/co64(check offset)
- chunk offset box(stco或co64)
- “stco”定义了每个thunk在媒体流中的位置。
- 位置有两种可能,32位的和64位的,后者对非常大的电影很有用。
- 在一个表中只会有一种可能,这个位置是在整个文件中的,而不是在任何box中的,这样做就可以直接在文件中找到媒体数据,而不用解释box。
- 需要注意的是一旦前面的box有了任何改变,这张表都要重新建立,因为位置信息已经改变了。
字段 | 字节数 | 意义 | 实例 |
---|---|---|---|
box size | 4 | box大小 | 00 00 04 84 |
box type | 4 | box类型 | 73 74 63 6F |
version | 1 | box版本,0或1,一般为0。(以下字节数均按version=0) | 00 |
flags | 3 | 00 00 00 | |
条目数目 | 4 | chunk offset的数目 | 00 00 01 1D |
chunk offset | 字节偏移量从文件开始到当前chunk。这个表根据chunk number索引,第一项就是第一个chunk,第二项就是第二个chunk | ||
大小 | 4 | 每个chunk大小 | 00 00 5B 2B 00 00 5B 40 00 00 67 85 … 00 0E 2E 2F |