我对M4A文件格式的理解

时间秒杀一切 提交于 2020-03-11 13:18:32

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

                                              

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!