我对M4A文件格式的理解

news/2024/11/28 2:00:55/

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

                                              

 


http://www.ppmy.cn/news/789751.html

相关文章

将 Dash 改为 Bash

#先看看是用的哪个 shell ls -al /bin/sh #如果是 Dash 可用以下方法切回 Bash(选择 NO) 方法一 sudo dpkg-reconfigure dash 方法二 sudo ln -fs /bin/bash /bin/sh

将Linux shell改为bash

查看shell是否为bash,在终端运行如下命令 ls -l /bin/sh 如果显示为“/bin/sh -> bash”则为正常,否则请按以下方式修改: 方法一:在终端运行如下命令,然后选择 no。 sudo dpkg-reconfigure dash 方法二&#x…

【CANopen】周立功轻松入门CANopen笔记

前言 想学习些新东西了,原本想直接学学Ethercat,但是简单看了看对象字典啥的概念一头雾水的,决定先从CANopen开始,Ethercat看着头疼。Etehrcat和CANopen有挺多类似的地方。感谢ZLG的这个入门笔记,我似乎是看懂了些&am…

将查询字符串改为对象

接下来给大家介绍一个封装的函数,可以通过这个函数将一个url地址中的查询字符串提取出来,并且转换为一个对象。 运行结果如下:

pip改为pip3

pip改为pip3 记录问题: 最近换了电脑用pip安装时总是默认用Python2,导致安装后Python3里仍然不能使用安装的包 已解决: 修改./~bashrc文件,添加: alias pip"pip3.7" alias python"python3.7"执行…

mysql怎么把只读改为读写

如果你想把 MySQL 的只读模式改为读写模式,你可以使用以下步骤: 连接到 MySQL 服务器: mysql -u username -p输入密码并登录到 MySQL 服务器。 使用以下命令来查看当前数据库的只读模式设置: SHOWVARIABLES LIKE read_only;如果只…

用户名中文改为英文

1.管理员身份运行命令行窗口 2.net user administrator /active:yes 3.注销当前账号,使用管理员账号登陆 4.为文件重命名 5. WinR之后输入regedit进入注册表编辑器WinR之后输入regedit进入注册表编辑器