关于Sample的分析报告

首先,这是一个典型的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的长度也不完全相同。

原文地址:https://www.cnblogs.com/xizhu/p/9502723.html