写在前面
最近正在学习并整理音视频相关材料,我习惯性的把最近学到的东西分享出来。如果大家感兴趣,可以订阅我的专题 视频播放器和音视频基础知识。
正文
MP3方面的资料网上现有的都大同小异,我是参考了一篇网上的博客。原文地址是:原文在这里,感谢博主的博客。
MP3音频帧
一个MPEG音频文件是由很多帧数据组成。每一帧包含了一个帧头以及其后的音频数据。同一个文件每一帧的音频数据的采样次数总是相同的。Layer II,II,III的音频帧头都是相同的,不同之处体现在音频数据的编码方式。帧本身是由slot组成的。Layer I的slot大小是4字节,其余情况是1字节。
除了Layer之外,MPEG音频本身也有3个版本,这个几个版本的不同之处体现在能处理的采样率不同(参考 表2.1.2)。MPEG 1 (ISO/IEC 13818-3) 和MPEG2(ISO/IEC 11172-3)是ISO标准. MPEG2.5对MPEG2进行的非官方的扩展,它是为了支持更低的采样率。MPEG2/2.5 也常被简称为LSF(Low SamplingFrequencies),既低采样率。每个版本的MPEG都有3种不同的Layer。如果你想知道关于MPEG音频文件的更多的技术细节,请参考规范说明。你可以在www.MP3-Tech.org找到规范说明和许多其他关于MPEG有用的信息。
一个文件可以被编码成恒定比特率(CBR)或可变比特率(VBR),这意味着每帧可以有不同的比特率。可变比特率的质量往往比恒定比特率编码的文件更高,因为他们可以在需要的地方使用更高的比特率。
MPEG音频帧头
帧头位于每帧的开始处,大小通常是32bits(若Protection bit为1,则还要帧头最后添加16bits的校验位),并具有以下格式。帧头中第0位是最高有效位(MSB)。在头位的0是最重要的一点完整的头(最高位)。请注意,位置是从零开始的,位置,长度和示例都是用位格式表示。
起始位置 | 大小 | 作用 | 示例 |
---|---|---|---|
0 | 11 | 帧同步标识,11个‘1’。用于定位帧头起始位置 | 11111111111 |
11 | 2 | MPEG音频版本 ID: 00:MPEG version2.5 01:reserved 10:MPEG Version 2 11:MPEG Version 1 |
01 |
13 | 2 | Layer 序列号: 00 - reserved 01 - Layer III 10 - Layer II 11 - Layer I |
01 |
15 | 1 | Protection bit: 0 - protected by 16 bit CRC following header 1 - no CRC |
1 |
16 | 4 | 比特率索引 | 1001 |
20 | 2 | 采样率索引 | 11 |
22 | 1 | Padding bit: 如果设置了,则用一个slot填充数据(slot对框架大小的计算很重要) Layer I的slot大小是4字节,其余情况是1字节。 |
1 |
23 | 1 | 保护位 | 1 |
24 | 2 | channel模式: 00 - 立体声 01 - 联合立体声(立体声) 10 - 双通道(两个单声道) 11 - 单声道 注意:双通道文件由两个独立的单声道组成。每一个都只使用了文件的一半比特率。大多数解码器将其输出为立体声,但情况并非总是如此。 |
00 |
26 | 2 | 模式扩展(只用于联合立体声) | 00 |
28 | 1 | 版权位 | 1 |
29 | 1 | 原始位 | 1 |
30 | 2 | Emphasis: 00 - none 01 - 50/15 ms 10 - reserved 11 - CCIT J.17 很少用 |
00 |
MPEG Audio Frame Header
抽样速率指定每秒钟有多少个样本被记录。每个MPEG版本可以处理不同的samplingrates。
采样率索引 | MPEG-1 (Hz) | MPEG-2 (Hz) | MPEG-2.5 (Hz) |
---|---|---|---|
00 | 44100 | 22050 | 11025 |
01 | 48000 | 24000 | 12000 |
10 | 32000 | 16000 | 8000 |
11 | reserved | reserved | reserved |
MPEG 采样率索引表
比特率的单位是 kbit/s。请注意,这里的kbit/s指的是1000bit/s,而不是1024!比特率指数1111保留,不应该被使用。在MPEG音频标准中有一个自由格式描述。这个自由格式意味着该文件是以恒定比特率编码的,但不是预定义的编码比特率。只有极少数的解码器能够处理这种文件。
在MPEG-1 LayerII中,只有某些比特率和某些模式的组合是允许的(如下表)。在MPEG -2/2.5,没有此限制。下表是允许的比特率和模式的组合:
比特率 | 允许的模式 |
---|---|
free | all |
32 | 单声道 |
48 | 单声道 |
56 | 单声道 |
64 | all |
80 | 单声道 |
96 | all |
112 | all |
128 | all |
160 | all |
192 | all |
224 | 立体声,强度立体声,双通道 |
256 | 立体声,强度立体声,双通道 |
320 | 立体声,强度立体声,双通道 |
384 | 立体声,强度立体声,双通道 |
对于计算帧的大小,你需要每帧的MPEG音频数据的样本数。你可以使用下面的表来获取每帧的MPEG音频数据的样本数:下图是每一帧数据的采样数
MPEG 1 | MPEG 2 (LSF) | MPEG 2.5 (LSF | |
---|---|---|---|
Layer I | 384 | 384 | 384 |
Layer II | 1152 | 1152 | 1152 |
Layer III | 1152 | 576 | 576 |
帧大小的计算公式如下:
帧大小 = ( 每帧采样次数 × 比特率(bit/s) ÷ 8 ÷采样率) + Padding
由于舍入误差,官方公式计算帧的大小是一个有点不同。根据ISO标准,你需要以slot为单位计算帧大小,然后截断这个数字成为整数,之后与槽的大小相乘。你可以在CMPAHeader类中计算帧大小的正确方法。
在实际项目开发中,对一帧的数据进行处理的时候,缓冲区里存放的数据大小需要比计算出的一帧大小要大一些,比如再多上8个字节。
扩展模式用于加入信息,没有使用的立体声效果,从而减少所需的比特位数据。这些比特位数据是在联合立体模式下编码器动态确定的,每一帧的联合立体模式都可以改变,甚至打开或关上。对于其它的声道模式,扩展模式是无效的。
MPEG音频文件的完整的频率范围被划分成多个子带。共有32个子带。对于Layer I、II,the two bits in the header determine the frequency range (bands)where the intensity stereo is applied。在这个频率范围内,只有一个通道被存储。所有其他的子带包含两个独立声道的信息。对于Layer III,这两个位决定使用哪一种类型的关节立体声(增强立体声和/或M / S立体声)。
CRC校验
若保护位为0,则音频帧中会包含一个16位的CRC(循环冗余校验和)。这个校验和直接跟踪帧头和大字. 为了验证CRC,你必须计算音频帧的校验和,并与存储的CRC进行比较。若不等,则可能传输途中数据被损坏。检查CRC也有利于来验证你真的发现了一帧的开始位置,因为同步位在相同的情况下也发生在一个帧的数据中。
CRC是采用计算的CRC - 16算法(生成器polynom 0x8005),也是一帧的一部分。下面的数据被认为是CRC:帧头的最后两个字节,和音频数据中一些紧接CRC字段的比特位。当计算CRC的时候,需要跳过校验和字段。不幸的是,在Layer II中没有简单的方法来计算出用于计算校验和的必要帧的数量。
你需要帧头之外的其它信息来计算所需的比特位。但是,从帧头信息中可以计算出在Layer I和Layer III中保护比特位的数量。
对于Layer III,在计算CRC的时候,你需要考虑完整的边信息。
边信息紧接着帧头。它包含了一些解码器会用到的一些信息,用于解码器控制音频流的播放,但不包含实际的音频数据。下表显示了所有Layer III文件的边信息的大小。
MPEG 1 | MPEG 2/2.5 (LSF) | |
---|---|---|
立体声,联合立体声,双通道 | 32 | 17 |
Mono | 17 | 9 |
对于Layer I的文件,你必须考虑到扩展模式(见表2.1.6)。然后你可以以下公式计算出用于计算CRC的比特位的数量:
4 * ( 声道数 * bound of intensity stereo + (32 - bound of intensity stereo) );
这可以被读成两倍的立体声子带加上单子带的数量和结果乘以4。对于简单的mono帧,这等于128,因为通道的数目是1,而强度立体声的边界是32,这意味着没有强度立体声。对于立体帧,这是256。有关更多信息,请查看类CMPAFrame中的rc代码。
CBR
可以通过以下公式可以获取播放时长 (仅适用于恒定码率文件):
播放时长 = ( 文件大小 – ID3大小 ) × 8 ÷ 比特率(bit/s)
VBR头
有些文件的编码是可变比特率模式(VBR)的。为了估计这些文件的时间,你必须知道整个文件的平均比特率。它常常与第一帧的码率相差很多,因为最低的比特率可用在音乐沉默时(尤其是在开始时)。要获得这个平均率,你必须通过所有的帧中的文件,并计算出每帧的比特率,相加的总和除以帧数。而这不是一个好的做法(很慢)。在第一帧的音频数据区中存在一个附加的VBR头。它包含了文件中的帧的总数,有了总帧数,我们可以用以下公式计算音频的播放时长:
Duration = 总帧数 * 每帧采样数 / 采样率
而且,VBR头往往会包含一个表,当在文件中寻找位置的时候会利用到这张表。
因为这不是一个好的实践(非常慢),在firstframe(在框架标题之后)的数据部分中存在附加的VBR头。它们包含了文件中所有帧的总数,你可以用下面的公式来计算时间的持续时间:
XING头
大部分可变比特率编码的文件都会包含这个头。这个头位于第一个音频帧头之后的某个位置(后面会有具体介绍)。包含XING头的整个第一帧没有音频数据,因此,即使解码器不认识XING头,也可以解码该文件。
在Layer III文件中,XING头紧接着边信息之后。因此,你可以通过使第一帧帧头起始地址加上帧头大小(4个字节),然后再加上边信息大小(参考表2.2.1),就可以得到XING头的位置。虽然Layer III有边信息,但是Layer I、II、III都不用考虑16比特位的CRC(如果有的话)。
XING头起始位置 = MPEG第一帧帧头起始位置 + 帧头大小 + 边信息大小。
帧头大小 = 4(或6,当Protection bit==0时,帧头后会有16bit=2byte的CRC)。
为了读出这个头,你必须找到第一个MPEG音频帧头,然后去定位XING头的起始位置。XING头的格式如下:(请注意,位置是从零开始的。位置,长度和例子是以字节格式)下面表格是XING 头格式
位置 | 长度 | 说明 | 示例 |
---|---|---|---|
0 | 4 | 4个ASCII字符的VBR头ID,要么' Xing '或' Info ',而不是null终止 | “Xing” |
4 | 4 | 标志显示当前字段的标志,与逻辑或逻辑相结合。字段是强制性的。 0x00000001 - Frames field is present 0x00000002 - Bytes field is present 0x00000004 - TOC field is present 0x00000008 - Quality indicator field is present |
0x0007(指帧、字节和TOC有效) |
8 | 4 | Number of Frames as Big-Endian DWORD (optional) | 7344 |
8 or 12 | 4 | Number of Bytes in file as Big-Endian DWORD (optional) | 45000 |
8, 12 or 16 | 100 | 100 TOC entries for seeking as integral BYTE (optional) | |
8, 12, 16, 108, 112 or 116 | 4 | Quality indicator as Big-Endian DWORDfrom 0 - best quality to 100 - worst quality (optional) | 0 |
根据上面的格式说明,一个XING头必须至少包含ID字段和Flags字段,其余的字段是依靠与Flags字段的,并且是可选的。在一些情况下,CBR文件中也会包含这个头,在这种情况下,ID值一般用”Info”来标识
这里存在关于XING头的LAME扩展,它是由公同的LAME编码器来使用的,但我并没有过多考虑这一点,因为它不是必需的计算播放时长的因素。这里是为信息标签的MP3文件链接。
VBRI 头
据我所知,这个头只存在与用Fraunhofer编码器编码的MPEG音频文件中。它和XING头不同。你可以在第一帧音频帧头之后的32个字节偏移处准确地定位这个头。
VBRI头起始位置 = MPEG第一帧帧头起始位置 + 帧头大小 + 32。
帧头大小 = 4(或6,当Protection bit==0时,帧头后会有16bit=2byte的CRC)。
请注意,位置是从零开始的。位置,长度和例子是字节格式表示。下面表格是:VBRI Header
位置 | 长度 | 说明 | 示例 |
---|---|---|---|
0 | 4 | 4个ASCII字符的VBR头ID,总是“VBRI”,而不是null终止 | 'VBRI' |
4 | 2 | 版本号 | 1 |
6 | 2 | Delay as Big-Endian float | 7344 |
8 | 2 | 质量指标 | 75 |
10 | 4 | 字节数作为大字节数 | 45000 |
14 | 4 | 帧数作为大字的DWORD | 7344 |
18 | 2 | 在TOC表中作为big - endian单词的条目数 | 100 |
20 | 2 | Scale factor of TOC table entries as Big-Endian DWORD | 1 |
22 | 2 | Size per table entry in bytes (max 4) as Big-Endian WORD | 2 |
24 | 2 | Frames per table entry as Big-Endian WORD | 845 |
26 | TOC entries for seeking as Big-Endian integral. From size per table entry and number of entries, you can calculate the length of this field. |
MP3的文件的内容组织结构
所以,总结起来,一般的MP3文件所包含的内容如 下:
[ID3。。。] ID3 V2的头,大多数最新的MP3,都有这个头 [APE 头] 用于APE格式的头,现在也用于MPEG |
---|
第一帧包 含: 1. MPEG 音频头, 通常大小为4字节.(当Protection bit==0时,帧头后会有16bit=2byte的CRC,此时帧头大小为6字节) 2. 边信息,9/17/32 字节 [3.Xing 头] 8-120字节,如果是VBR,多数都有此Xing头,而且只有第一帧有 。。。。。音频数据。。。。。 |
第二帧(帧头,边信息,数据。。。) |
第三帧(帧头,边信息,数据。。。) |
。。。 |
最后一帧(帧头,边信息,数据。。。) |
[TAG 。。。] 128字节的ID3 V1信息,如果没有前面的ID3 V2,多数都有这个ID3 V1的头 |
注:[]号内的,表示,可选,即如果有的话。