FFmpeg音视频开发基础与实战
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

4.4.1 MP3格式

MP3 格式是最常用的音频文件格式之一,通常以“.mp3”作为文件扩展名。一个 MP3 文件以帧(Frame)为单位保存音频的码流数据,每帧数据都由帧头和载荷数据构成。除保存在帧中的音频码流数据外,MP3文件中还定义了两个标签结构,用来保存歌曲名称、作者、专辑和年份等音频文件的属性信息,并形成了ID3标签。目前常用的ID3标签包括ID3V1 Tag 和ID3V2 Tag两部分。ID3V1 Tag位于MP3文件的结尾,ID3V2 Tag位于MP3文件的头部,整体结构如图4-8所示。

图4-8

1.ID3V2 Tag

ID3V2 Tag通常位于MP3文件的头部。下面以二进制形式打开一个MP3文件,如图4-9所示。

图4-9

一个ID3V2 Tag包括一个标签头及若干标签帧,在必要时还可以增加一个扩展标签头。标签头的总长为10 Byte,结构定义如下。

每个字段的含义如下。

◎ file_id:Tag的标识符,即固定的三个字符“ID3”,如果找不到,则认定Tag不存在。

◎ version:Tag的主版本号,在图4-9中为“4”。

◎ reversion:Tag的次版本号,在图4-9中为“0”。

◎ flags:Tag的标识位,仅最高3bit有效,格式为“%abc0000”,含义如下。

⊙ bita:使用非同步编码。

⊙ bitb:包含扩展标签头结构。

⊙ bitc:该Tag为试验性标准,未正式发布。

◎ size:Tag中有效数据的大小(不包括Tag标签头)。

需要注意的是,ID3V2 Tag标签头中的size字段在计算实际长度时,首先抛弃最高位,由剩余7位构成一个28 bit整数,方为ID3V2 Tag的实际大小,如图4-10所示。

图4-10

在上文示例中,size字段保存的二进制内容为0x00000849,通过上述方法计算得到的实际Tag大小为0x0449,即1097 Byte。

在ID3V2 Tag标签头之后,是若干ID3V2 Tag标签帧。每个ID3V2 Tag标签帧又由标签帧头和标签帧数据组成。标签帧头的长度为10 Byte,结构定义如下。

在上述结构中,frame_id用4 Byte表示当前标签帧的类型,每字节的取值范围在“A”~“Z”26个字母和“0”~“9”10个数字之间。常见的frame_id如下。

◎ TIT2:标题。

◎ TPE1:作者。

◎ TABL:专辑。

◎ TYER:年份。

◎ TRCK:音轨、集合中的位置。

在frame_id的后面,以4 Byte表示当前标签帧的长度。例如,在图4-9中,“TIT2”对应的size字段取值为十六进制数值0x16,即表示该标签帧的长度为22 Byte。该长度为当前标签帧数据的长度。

在标签帧头中用2 Byte表示若干标志位,在MP3文件中,这些标志位通常设为0。

2.Frame

我们知道,MP3 文件保存的是对 PCM 音频采样数据进行压缩编码之后的码流数据,而采样值在MP3文件中以“帧”的形式保存。在每帧中,采样值的数量根据使用编码算法的不同而不同,针对MPEG-1 Audio标准,Layer1规定每帧保存384个采样值,Layer2和Layer3规定每帧保存1152个采样值。如果确定了音频的采样率,则可以进一步计算得到每帧的持续时间,即对于采样率为44.1kHz的MP3音频,每帧的持续时间为

在ID3V2 Tag之后,帧的二进制数据内容如图4-11所示。

图4-11

与ID3V2 Tag类似,MP3 Frame由帧头(Header)和帧数据(Side Data、Main Data、Ancillary Data)组成,整体结构如图4-12所示。

图4-12

帧头

帧头的固定长度为4 Byte(即32 bit),可以通过下面的定义表示。

在图4-11中,帧头的4 Byte取值分别为0xFF、0xFB、0x90和0x64。根据帧头定义可知,其每一bit所表示的含义如图4-13所示。

图4-13

具体含义如下。

(1)Sync(同步标识)。在每个帧头结构中,前11 bit为帧同步标识,该部分的每个bit都始终为1。

(2)Version(版本信息)。紧跟同步标识的两个bit表示所属MPEG标准的版本。版本号与取值的对应关系如下。

◎ 00:MPEG-2.5.

◎ 01:未定义。

◎ 10:MPEG-2.

◎ 11:MPEG-1.

从图4-13中可知,Version取值为11,对应的MPEG版本为MPEG-1。

(3)Layer(层信息)。版本信息后的两个bit表示当前音频文件的层信息。层信息与取值的对应关系如下。

◎ 00:未定义。

◎ 01:Layer3.

◎ 10:Layer2.

◎ 11:Layer1.

从图4-13中可知,当前音频文件为Layer3。综合版本信息和层信息可知,该测试音频文件的格式为MPEG-1 Layer3。

(4)CRC(循环冗余校验)。第二字节的最低位表示循环冗余校验标识位。该位为0时表示启用循环冗余校验,该位为1时表示禁用循环冗余校验。

(5)Bitrate(码率)。第三字节的最高4位表示当前音频文件的码率。在不同的版本和层中,取值和码率可能有不同的对应关系。针对MPEG-1(V1)、MPEG-2(V2)和MPEG-2.5的Layer1 (L1)、Layer2(L2)和Layer3(L3),码率对应关系如表4-3所示,码率单位为Kbps。

表4-3

当码流取值为“0000”时,码率设定为“free”,表示音频文件使用了标准限定之外的自定义值,此时使用的从码率必须固定,且小于允许的最高码率。当码流取值为“1111”时,应将码率设定为“bad”,表示禁用该取值。

在Layer2中,部分码率不能兼容所有的声道模式,兼容关系如表4-4所示。

表4-4

表4-4中的“yes”表示该模式兼容某指定码率,“no”表示该模式与此码率不兼容。

音频文件可以使用固定码率或变码率。变码率表示每帧可以使用不同的码率值,该特性适用于各个Layer,其中,对于Layer1和Layer2,decoder为可选特性;对于 Layer3,decoder为必选特性。此外,针对Layer3,一个帧还可以支持从前序帧获得的参考码率,以获得更大的码率取值范围,此情况将导致前后帧产生依赖,因此仅在Layer3中支持。

在图4-13中,码率部分的二进制取值为“1001”,音频文件版本为MPEG-1 Layer3,从表4-3中可知其码率为128Kbps。

(6)Sample Rate(采样率)。码率后面的 2bit 表示当前音频文件的采样率。采样率的取值与音频文件的版本有关,如表4-5所示。

表4-5

在图4-13中,采样率的取值为“00”,音频文件版本为MPEG-1,由此可知采样率为44100Hz。

(7)Padding(填充标识)。表示当前帧是否使用了填充位来达到指定的码率。0表示未使用填充位,1表示使用了填充位。

(8)Reserved(保留位)。该位的数据未被使用。

(9)Mode(声道模式)。帧头结构最后一个字节的高 2 位表示当前音频文件的声道模式。声道模式与取值的对应关系如下。

◎ 00:立体声。

◎ 01:联合立体声。

◎ 10:双声道。

◎ 11:单声道。

从图4-13中可知,该音频文件的声道模式为联合立体声。

(10)Mode Extension(扩展声道模式)。当声道模式为联合立体声时,可提供更多的关于声道模式的信息,该参数的含义与音频文件的版本和Layer值有关。

在MPEG的定义中,音频信息的完整频率范围被分为32个频率子带。对于Layer1和Layer2,扩展声道模式用于指定音频信息的子带序号范围,具体如下。

◎ 00:Bands 4 to 31.

◎ 01:Bands 8 to 31.

◎ 10:Bands 12 to 31.

◎ 11:Bands 16 to 31.

对于Layer3,扩展声道模式用于表示当前音频文件所使用的联合立体声的实际模式,即强化立体声模式或MS立体声模式,对应关系如表4-6所示。

表4-6

从图4-13中可知,该音频文件的扩展声道模式为MS立体声模式。

(11)Copyright(版权标识)。在帧头结构中,使用1bit表示当前音频文件是否有版权信息。当该位为0时,表示无版权信息;当该位为1时,表示有版权信息。

(12)Original(原始媒体标识)。在帧头结构中使用1bit表示当前音频文件是否为原始媒体文件。当该位为0时,表示该音频文件为原始媒体文件;当该位为1时,表示该音频文件为原始媒体文件的备份。

(13)Emphasis(强调方式标识)。表示当前音频文件是否经过“强调”处理,以及使用的“强调”处理方式,取值含义如下。

◎ 00:none.

◎ 01:50/15ms.

◎ 10:reserved.

◎ 11:CCITJ.17.

此信息不常用。

帧数据

(1)Side Data。在帧头之后,Side Data用于保存部分解码Main Data所需的信息。对于单声道音频流,Side Data的长度为17 Byte;对于多声道和立体声音频流,Side Data的长度为32 Byte。

(2)Main Data。Main Data可用来保存实际编码后的音频采样值,结构如图4-14所示。在MP3中,一帧数据保存了1152个采样点。在帧的Main Data中,这1152个采样点分别保存在两个编码颗粒(granule)中,每个编码颗粒保存576个采样点,分别用granule0和granule1表示。

以立体声音频格式为例,一帧中的任意一个编码颗粒均按照左声道和右声道保存数据。每个声道的编码数据均由两部分组成,即增益因子和哈夫曼码流。

图4-14

(3)Ancillary Data。Ancillary Data为一个可选结构,不显式地指定长度,其实际包含的数据为从Main Data末尾到下一个MP3的起始。

3.ID3V1 Tag

在一个MP3文件的末尾可以包含一个ID3V1 Tag,其作用与可能出现在文件头部的ID3V2 Tag相同,但其结构要比ID3V2 Tag简单得多。一个ID3V1 Tag的长度固定为128 Byte,其主要结构如下所示。

其每一部分的含义如下。

(1)ID3V1 Tag标识符。字符“A”的位置表示ID3V1 Tag标识符,共3 Byte,固定内容为字符“T”“A”“G”。

(2)标题。在ID3V1 Tag标识符之后,以30 Byte表示音频媒体的标题,即字符“B”所示位置。

(3)作者。在标题之后,以30 Byte表示当前音频媒体的作者信息,即字符“C”所示位置。

(4)专辑。在作者信息之后,以30 Byte表示当前音频媒体所属的专辑信息,即字符“D”所示位置。

(5)年份。字符“E”所代表的4 Byte表示音频媒体的年份信息。

(6)注释信息。在年份信息之后,以30 Byte保存音频媒体的注释信息,即字符“F”所示位置。

(7)节目流派。在ID3V1 Tag的最后一字节,即字符“G”所示位置。流派的取值表示音频节目的风格,部分常用取值如表4-7所示。

表4-7