系列文章目录
音频格式的介绍文章系列:
音频编解码格式介绍(1) ADPCM:adpcm编解码原理及其代码实现
音频编解码格式介绍(2) MP3 :音频格式之MP3:(1)MP3封装格式简介
音频编解码格式介绍(2) MP3 :音频格式之MP3:(2)MP3编解码原理详解
音频编解码格式介绍(3) AAC :音频格式之AAC:(1)AAC简介
音频编解码格式介绍(3) AAC :音频格式之AAC:(2)AAC封装格式ADIF,ADTS,LATM,extradata及AAC ES存储格式
音频编解码格式介绍(3) AAC :音频格式之AAC:(3)AAC编解码原理详解
文章目录
本文主要介绍MP3,即MPEG1 Layer-3
本文网址:https://blog.csdn.net/littlezls/article/details/135705670
1、 MP3文件结构
对于mp3来说现在有两种编码方式,一种是CBR,也就是固定位率,固定位率的帧的大小在整个文件中都是是固定的,只要知道文件总长度,和从第一帧帧头读出的信息,就都可以通过计算得出这个mp3文件的信息,比如总的帧数,总的播放时间等等,要定位到某一帧或某个时间点也很方便,这种编码方式不需要文件头,第一帧开始就是音频数据。另一种是VBR,就是可变位率,VBR是XING公司推出的算法,所以在MP3的FRAME里会有“Xing"这个关键字(也有用"Info"来标识的),它存放在MP3文件中的第一个有效帧的数据区里,它标识了这个MP3文件是VBR的。同时第一个帧里存放了MP3文件的帧的总个数,这就很容易获得了播放总时间,同时还有100个字节存放了播放总时间的100个时间分段的帧索引,假设4分钟的MP3歌曲,240S,分成100段,每两个相邻INDEX的时间差就是2.4S,所以通过这个INDEX,只要前后处理少数的FRAME,就能快速找出我们需要快进的帧头。其实这第一帧就相当于文件头了。不过现在有些编码器在编码CBR文件时也像VBR那样将信息记入第一帧,比如著名的lame,它使用"Info"来做CBR的标记。
1.1 VBR头文件[1]
VBR文件头位于MP3文件中第一个有效帧的数据区,详细结构如下:
1.2 MP3文件结构
一般可以分为4个部分,如下表所示:
1 | 2 | 3 | 4 |
---|---|---|---|
ID3v2 | Frame1 Frame2 … FrameN | APEv2 | ID3v1 |
其中ID3v2,APEv2,ID3v1这三部分是
可选项,是存放文件的一些其他信息,例如:作者,专辑等,与编解码没有任何关系。解码的时候,如果有这部分内容,需要跳过这些数据。
1.3 Frame
frame具体内容可以查看ISO/IEC 11172-3、ISO/IEC 13818-3
MP3数据是按照一帧一帧的方式存储的:Frame1 Frame2 … FrameN,每个Frame如下表所示:
Frame Header 4字节 | CRC 2字节(可选) | Side information | Main data |
---|
1.3.1 Frame Header
其长度为 4 字节,数据结构如下:
typedef struct tagHeader {
unsigned int sync : 11 ; / / 同步信息
unsigned int version : 2 ; / / 版本
unsigned int layer : 2 ; / / 层
unsigned int error2protection : 1 ; / / CRC 校正
unsigned int bit2rate2index : 4 ; / / 位率索引
unsigned int sample2rate2index : 2 ; / / 采样率索引
unsigned int padding : 1 ; / / 空白字
unsigned int extension : 1 ; / / 私有标志
unsigned int channel2mode : 2 ; / / 立体声模式
unsigned int mode extension : 2 ; / / 保留
unsigned int copyright : 1 ; / / 版权标志
unsigned int original : 1 ; / / 原始媒体
unsigned int emphasis : 2 ; / / 强调方式
} HEADER
各bit位排列如下:
AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM
具体数据结构含义如下:
1.3.2 Side information
Mpeg1 layer 3 的Side information格式如下:
main_data_begin | private_bits | scfsi_ch0 scfsi_ch1 | gr0(ch0, ch1) , gr1(ch0, ch1) |
---|
具体描述见下图:
main_data_begin: 表示一帧数据main_data开始的位置。表示main data相对于该帧同步头的负偏移。这里涉及到bit reservior技术:即把当前帧未使用完的bit数,留给后面需要的帧使用,这就导致每一帧的main data开始的位置,可能在它的Header和side information之前。这种技术就叫做bit reservoir。
Private_bits:留作私用。
Scfsi:表明两个granule是否使用相同的缩放因子。
scalefac_compress:被编码的缩放因子所占的比特数。
Part_2_3_length:表示main data中scalefactor和Huffman数据所占的比特数。
Global_gain:全局量化步长。
window_switching_flag、 block_bype和mixed_block_type:当window_switching_flag未置位时,block_type为0;当其置位时, block_type由mixed_block_type[gr][ch]指定,如下图所示:
当block_type为0、1、3时,为长块;为2时,为短块。mixed_block_flag[gr][ch]为1时,为混合块。
Table_select、Big_value、count1_table_select、Region0_count和region1_count:参考Huffman码表选择。
subblock_gain:短窗量化时所用的增益偏移量。
preflag和scalefac_scale:反量化时用到的变量。
1.3.3 Main data
main data的结构如下图所示:
其中 granule0 和 granule1 表示在一帧里面的粒度组 1 和粒度组 2,channel0 和 channel1 表示在一个粒度组里面的两个通道,scalefactor 为尺度因子 quantized value 为量化后的哈夫曼编码值,它分为 big values 大值区和 count1 1 值区
CRC 校验:表达式为 X16+X15+X2+1
2、资料下载
MPEG-1 (即ISO/IEC 11172)
MPEG-2(即ISO/IEC 13813)
MPEG-4(即ISO/IEC 14496)
ISO/IEC 11172 全部1-3部分全文下载:
https://download.csdn.net/download/littlezls/88754692
ISO/IEC 13818全部1-9部分全文下载 :
https://download.csdn.net/download/littlezls/88754693
3、参考网址
[1] : MP3文件结构解析(超详细)
https://blog.csdn.net/u010650845/article/details/53520426
[2] : MP3文件格式与编码原理解码流程详解
https://blog.csdn.net/yuyin86/article/details/7097933/