m4a 格式文件中的内容是有很多的box 组成的,box 格式如下:
box length(4B 大端格式) + box type(4B)+ box content(box length - 8)
例如如下是ftyp这个box 的数据内容,可以看到该box 长度是0x20字节。
从m4a文件中找到moov box是重点,因为找到了这个box ,需要从box 找出来每个采样帧的位置及大小。
一般是需要从m4a中找到如下的结构,重点是知道stsd stts stsc stsz stco这几个box。
moov
--->trak
--->mdia
--->minf
--->stbl
--->stsd
--->mp4a
===》从这里可以得到channel num、sample bits、sample rate;
--->esds
===》从这里可以得到audio type、max bitrate、avg bitrate、decoder config data;
--->stts
===》可以获取该trak下面有多少的samples,如下第一个参数是0x00000001,那么后面四个字节组成的就是 这个trak中的samples count=0x00002c64;
--->stsc
===》会得到一个表格,关于这个表的数据如何去理解,用一个实际例子来说明。第个参数0x00000002,那么
后面的数据有两组:(0x00000001 0x00000015 0x00000001)
(0x0000021e 0x00000003 0x00000001)
可以得出如下信息:
trunk 编号是从0x00000001 ~ 0x0000021e;
编号从0x01~0x21d的trunk,每个trunk都有0x15个sample;
编号从0x21e的trunk,有0x3个sample;
所以计算一下samples=0x21d * 0x15 + 0x3 = 0x2c64,这和上面stts是相匹配的。
--->stsz
===》这个表可以知道每个sample的大小。
两个红色数据分别是0x00000000 0x00002c64(表示后面有0x2c64的四字节记录每个sample 大小)
--->stco
===》可以知道每个trunk的位置
红色数据是0x0000021e,表示后面有0x21e个四字节记录每个trunk的位置;
例如编号1的trunk的位置在文件的0x00000030位置;
例如编号2的trunk的位置在文件的0x000021e3位置;
----》我们可以算一下,根据前面0x21d个trunk每个都是有0x15个sample,sample的大小可以通过stsz 知道,计算下来编号1的trunk中这15个sample的size总共是0x21b3。
由于第一个trunk的位置是0x30;
所以第二个trunk的位置是0x21b3+0x30=0x21e3,这佐证了这里记录的trunk位置。
===》通过编号1的trunk的位置0x30,也就是第一个sample的位置;
那么第二个sample的位置就是0x30+0x173(来自于stsz的数据)=0x1a3