Mp4格式分析:Adobe的sample1_1500kbps.f4v文件格式之二:moov分析

MOOV的stbl(SampleTable)包含了关于Sample(Audio/Video)如何组织的。

每个audio/video track box都有个stbl,描述了chunk和sample的对应关系。

stbl的结构

stbl的结构如下:


Mp4把mdat(存放媒体数据的box)分为Chunk,每个Chunk包含Sample,Sample即为视频的帧或音频数据。

mdatt的结构如下:


下面结合数据说明对应关系,数据可以参考“Mp4格式分析:Adobe的sample1_1500kbps.f4v文件格式之一,文件结构”和“f4v-moov.log下载”。

Chunk的Offset

首先,说明各个chunk的offset,是在stco(Chunk Offset stco)中定义的,每个track都有一个,譬如:

video track,视频的chunk的offset信息:

box(F4vChunkOffsetStcoBox,"stco",0x7374636F):
    header:
        total_size:172(0x000000AC)
        box_type:1937007471(0x7374636F)
    payload:
        version:0(0x00)
        flags:0(0x000000)
        offset_count:39(0x00000027)
        offsets:
            chunk_offset:53932(0x0000D2AC)
            chunk_offset:359182(0x00057B0E)
            chunk_offset:931430(0x000E3666)
            chunk_offset:1171186(0x0011DEF2)
            chunk_offset:1236607(0x0012DE7F)
            chunk_offset:1711188(0x001A1C54)
            chunk_offset:2283310(0x0022D72E)
            chunk_offset:2862003(0x002BABB3)
            chunk_offset:3406733(0x0033FB8D)
            ...........................
            chunk_offset:19566362(0x012A8F1A)

如下图所示:

因为VideoChunk之后是个AudioChunk,所以VIdeoChunk0的大小=AudioChunk0Offset-VideoChunk0Offset。

把第二个track,即音频track的信息贴在下面:

chunk_offset:
    box(F4vChunkOffsetStcoBox,"stco",0x7374636F):
        header:
            total_size:172(0x000000AC)
            box_type:1937007471(0x7374636F)
        payload:
            version:0(0x00)
            flags:0(0x000000)
            offset_count:39(0x00000027)
            offsets:
                chunk_offset:334724(0x00051B84)
                chunk_offset:906122(0x000DD38A)
                chunk_offset:1145912(0x00117C38)
                chunk_offset:1211243(0x00127B6B)
                chunk_offset:1686344(0x0019BB48)
                chunk_offset:2257621(0x002272D5)
                chunk_offset:2836800(0x002B4940)
                chunk_offset:3381618(0x00339972)
                chunk_offset:3938809(0x003C19F9)
                chunk_offset:4524709(0x00450AA5)
                chunk_offset:5085138(0x004D97D2)
                ...........................
                chunk_offset:18975430(0x01218AC6)
                chunk_offset:19541106(0x012A2C72)
                chunk_offset:19693547(0x012C7FEB)

如下图所示:


即:

VideoChunk0 size = AudioChunk0Offset - VideoChunk0Offset = 334724 - 53932 = 280792字节。

也就是第一个VideoChunk里面包含的Sample总长度为280792。

Chunk包含多少个Sample

某个Chunk包含多少个Sample呢?定义在stsc(sample to chunk)结构里面。

以视频为例,数据如下:

sample_to_chunk:
    box(F4vSampleToChunkBox,"stsc",0x73747363):
        header:
            total_size:112(0x00000070)
            box_type:1937011555(0x73747363)
        payload:
            version:0(0x00)
            flags:0(0x000000)
            count:8(0x00000008)
            first_chunk:1(0x00000001)
            samples_per_chunk:90(0x0000005A)
            samples_desc_index:1(0x00000001)
            first_chunk:12(0x0000000C)
            samples_per_chunk:89(0x00000059)
            samples_desc_index:1(0x00000001)
            first_chunk:13(0x0000000D)
            samples_per_chunk:90(0x0000005A)
            samples_desc_index:1(0x00000001)
            ...........................
            first_chunk:39(0x00000027)
            samples_per_chunk:18(0x00000012)
            samples_desc_index:1(0x00000001)

first_chunk说明开始的chunk,samples_per_chunk说明这个范围的chunk包含多少个samples。如下图所示:


如果知道每个Sample的尺寸,就知道了每个Sample的offset了。

Sample的尺寸

Sample的尺寸定义在stsz(SampleSize)box中,以Video track为例,数据如下:

sample_size:
    box(F4vSampleSizeBox,"stsz",0x7374737A):
        header:
            total_size:13760(0x000035C0)
            box_type:1937011578(0x7374737A)
        payload:
            version:0(0x00)
            flags:0(0x000000)
            constant_size:0(0x00000000)
            size_count:3435(0x00000D6B)
            size_table:
                sample_size:1593(0x00000639)
                sample_size:229(0x000000E5)
                sample_size:96(0x00000060)
                sample_size:95(0x0000005F)
                sample_size:718(0x000002CE)
                sample_size:152(0x00000098)
                sample_size:148(0x00000094)
                sample_size:1402(0x0000057A)
                sample_size:260(0x00000104)
                sample_size:246(0x000000F6)
                sample_size:649(0x00000289)
                sample_size:95(0x0000005F)
                sample_size:111(0x0000006F)
                sample_size:2330(0x0000091A)
                sample_size:370(0x00000172)
                sample_size:696(0x000002B8)
                sample_size:7100(0x00001BBC)
                sample_size:1890(0x00000762)
                sample_size:2101(0x00000835)
                ...........................
                sample_size:2520(0x000009D8)
                sample_size:2838(0x00000B16)
                sample_size:1995(0x000007CB)

把前90个的尺寸加起来,正好是第一个VideoChunk0的长度:280792B。

图汇总:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

winlinvip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值