首先,这是一个典型的sample Table box:
一、 Stbl box中常见的子box:
stts:Decoding Time to Sample Box时间戳和Sample映射表。通过这个box可以实现时间到sample number的映射。
stsd:Sample Description,主要描述当前track有关的编码信息,以及用于初始化解码的附加信息。
stsz,stz2:Sample Size Boxes每个Sample大小的表。
stsc:Sample to chunk的映射表。
stco,co64:Chunk位置偏移表。
Stss:关键帧index。
二、对主要的子box进行解析:
(1)解析stsd可获得coding型、视频宽高、音频samplesize、channelcount这些和解码器有关信息。
(2)解析stsz box 可以获得一个sample size的表。
Filed name |
type |
Size(bits) |
FullBox Header |
--- |
--- |
sample_size |
uint32 |
32 |
sample_count |
uint32 |
32 |
entry_size |
uint32[] |
varies |
sample_size中表示sample长度,如果是0表示每个sample长度不定,会记录在entry_size中;否则每个sample长度一样,并且entry_size域不存在。
'stz2' box中的entry_size是compact的,长度由特定字段指定。
(3)解析stsc 还原Sample 与chunk的映射表 ,记录了每个chunk中包含多少sample,其结构定义如下:
Filed name |
type |
Size(bits) |
FullBox Header |
--- |
--- |
entry_cout |
uint32 |
32 |
chunk_entry |
uint32[3] |
varies |
chunk_entry包含三个字段:
first_chunk: uint32
samples_per_chunk: uint32
sample_description_index: uint32
每个entry表示从first_chunk开始的每个chunk都包含samples_per_chunk个samples,这些sample都可以用使用sample_description_index信息解码。通过这个box,可以构建出当前track的chunk结构,及其包含的sample。
Sample 是存储的最基本单元,mp4把Sample 存在chunk中。chunk的长度、chunk的大小、chunk中Sample的数量及大小都是不定的。通过解析这部分box来还原这个映射表。
(4) “stco”这个box记录了chunk对应的offset,只是包含字段一个是32为('stco'),一个是64位('co64')。
chunk offset box中记录都是相对文件的偏移量,可以直接通过这些信息读取。
三、小结
由于'mdat' box中的多媒体数据是没有结构的,只能参考moov的trak box解析。反过头来。我们看一下针对单个track中的media信息存储应该是下面的结构
|chunk #0| chunk#1| ... | chunk #n|
每个chunk的构成是下面的结构:
|sample #0|sample #1| ... | sample #n|
从trak box中的minf中可以看出,每个chunk的长度不定,其所包含的sample数目不同,每个sample的长度也不完全相同。