MP3头帧详解

写在前面

最近正在学习并整理音视频相关材料,我习惯性的把最近学到的东西分享出来。如果大家感兴趣,可以订阅我的专题 视频播放器和音视频基础知识

正文

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 采样率索引表

在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的头

注:[]号内的,表示,可选,即如果有的话。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容