音频格式之MP3:(1)MP3封装格式简介

系列文章目录

音频格式的介绍文章系列:
音频编解码格式介绍(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编解码原理详解


文章目录

  • 系列文章目录
  • 1、 MP3文件结构
    • 1.1 VBR头文件[1]
    • 1.2 MP3文件结构
    • 1.3 Frame
      • 1.3.1 Frame Header
      • 1.3.2 Side information
      • 1.3.3 Main data
  • 2、资料下载
    • ISO/IEC 11172 全部1-3部分全文下载:
    • ISO/IEC 13818全部1-9部分全文下载 :
  • 3、参考网址

本文主要介绍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文件中第一个有效帧的数据区,详细结构如下:
音频格式之MP3:(1)MP3封装格式简介_第1张图片

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
具体数据结构含义如下:
音频格式之MP3:(1)MP3封装格式简介_第2张图片
音频格式之MP3:(1)MP3封装格式简介_第3张图片
音频格式之MP3:(1)MP3封装格式简介_第4张图片
音频格式之MP3:(1)MP3封装格式简介_第5张图片
音频格式之MP3:(1)MP3封装格式简介_第6张图片
音频格式之MP3:(1)MP3封装格式简介_第7张图片
音频格式之MP3:(1)MP3封装格式简介_第8张图片

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)

具体描述见下图:
音频格式之MP3:(1)MP3封装格式简介_第9张图片
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]指定,如下图所示:
音频格式之MP3:(1)MP3封装格式简介_第10张图片
当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的结构如下图所示:
音频格式之MP3:(1)MP3封装格式简介_第11张图片
其中 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/

你可能感兴趣的:(audio,vs,开发类,c++,音视频,数据结构)