FFmpeg之音频封装格式、音频编解码器

语音基础知识:https://mp.csdn.net/editor/html/111210192

音频封装格式

无损压缩
无损压缩指的是在无损格式之间的压缩(转换),无论压缩(转换)成什么格式,音质都是相同的,并且都能还原成最初同样的文件。平时所说的无损均是指无损压缩,没有无损码率的说法。对于各种格式的压缩都是对应着一种算法(或者说编码),播放的时候需要有解码器进行译码,而且不同的解码器也可能会影响解压出来的文件完整性。常见的无损格式有:
wav:微软公司的一种声音文件格式,是无压缩的最接近真实声音的格式(其次是midi),支持多采样率多量化精度。所有的无损格式本质都是wav的压缩,在播放时会转回wav。
flac:Free Lossless Audio Coded,是国际通用格式,特点是压缩比高,编码算法也相当成熟,当flac文件受损时依然能正常播放。另外,该格式也是最先得到广泛硬件支持的无损格式。
ape:使用Monkey‘s Audio软件对CD抓轨而转换成的文件格式,但优势并不突出,解码较慢。
wma-lossless:也是微软公司出品,特点是压缩比高,但未成为主流。
aiff:苹果公司出品,是Apple苹果电脑上面的标准音频格式。
DSD:Sony大法的,不是很了解,欣赏不来辣种文化,但就说单纯的冲,还是要冲的。

有损压缩
有损压缩指的是声音信息在压缩过程中发生了丢失,且所丢失的声音无法用采样率和位数表示出来。但特点就是压缩后的文件变的很小,常在流媒体中使用。常见的有损格式有:
mp3:模拟人耳听觉研究出的一种复杂算法,被称为“心理声学模型”。它通过抽取音频中的一些频段来达到提高压缩比,降低码率,减少所占空间,但同时声音的细节如人声的情感、后期的混响等等都已经发生变形。盲听的话也很难较快地分辨出wav和mp3,需要借助设备。mp3目前是最为普及的声频压缩格式,可以最大程度地保留压缩前的音质。
wma:微软公司力作,不开放,哟版权。特点是在较低比特率下(如64kbps),wma可以在与mp3相同的音质条件下获得更小的体积。并且在超低比特率(如16kbps),wma音质比mp3要好得多。
aac:苹果电脑上的声音文件储存格式。
ogg:完全免费、开放和没有专利限制,但普及性较差。

m4a:M4A是MPEG-4 音频标准的文件的扩展名,最常用的.m4a文件是使用AAC格式的(文件),不过其他的格式,比如Apple Lossless甚至mp3也可以被放在.m4a容器里(TC注:这个container的概念类似于.mkv文件)。可以安全地把只包含音频的.mp4 文件的扩展名改成.m4a。

 

*************aac***********

 

我们采用的是脉冲代码调制编码,即PCM编码。它是一种将模拟语音信号转换为数字信号的编码方式,是无损非压缩编码。PCM通过抽样、量化、编码三个步骤将连续变化的模拟信号转换为数字编码(最后输出一组二进制数据,就是PCM格式的数据,该文件没有附加的文件头和文件结束标志)。PCM又称为脉冲调制数据,是计算机可以播放的最原始数据。

ADTS可以在任意帧解码,也就是说它每一帧都有头信息。ADIF只有一个统一的头,所以必须得到所有的数据后解码。且这两种的header的格式也是不同的,目前一般编码后的和抽取出的都是ADTS格式的音频流。

AAC原始流能让ffmpeg软解或系统硬解码,需要在ES流前面加上ADTS头,打包成ADTS的格式,一般是在AAC ES流前添加7个字节的ADTS header。

AAC音频文件的每一帧由ADTS Header和AAC Audio Data组成。https://www.cnblogs.com/zhangxuan/p/8809245.html

FFmpeg之音频封装格式、音频编解码器

一般情况下ADTS的头信息是7个字节,分为2部分:

  • 抽样:对模拟信号进行周期性扫描,把时间上连续的信号变成时间上离散的信号;
  • 量化:用一组规定的电平,把瞬时抽样值用最接近的电平值来表示,通常是用二进制表示;
  • 编码:用一组二进制码组来表示每一个有固定电平的量化值;
  • 采样后的数据大小 = 采样率值×采样大小值×声道数 bps。
    一个采样率为44.1KHz,采样大小为16bit,双声道的PCM编码的WAV文件,它的数据速率=44.1K×16×2 bps=1411.2 Kbps= 176.4 KB/s。

  •   AAC是高级音频编码(Advanced Audio Coding)的缩写,出现于1997年,最初是基于MPEG-2的音频编码技术。由Fraunhofer IIS、Dolby Laboratories、AT&T、Sony等公司共同开发,目的是取代MP3格式。2000年,MPEG-4标准出台,AAC重新集成了其它技术(PS,SBR),为区别于传统的MPEG-2 AAC,故含有SBR或PS特性的AAC又称为MPEG-4 AAC。

        AAC是新一代的音频有损压缩技术,它通过一些附加的编码技术(比如PS,SBR等),衍生出了LC-AAC,HE-AAC,HE-AACv2三种主要的编码,LC-AAC就是比较传统的AAC,相对而言,主要用于中高码率(>=80Kbps),HE-AAC(相当于AAC+SBR)主要用于中低码(<=80Kbps),而新近推出的HE-AACv2(相当于AAC+SBR+PS)主要用于低码率(<=48Kbps),事实上大部分编码器设成<=48Kbps自动启用PS技术,而>48Kbps就不加PS,就相当于普通的HE-AAC。

  • AAC共有9种规格,以适应不同的场合的需要:

           MPEG-2 AAC LC 低复杂度规格(Low Complexity)--比较简单,没有增益控制,但提高了

      编码效率,在中等码率的编码效率以及音质方面,都能找到平衡点

           MPEG-2 AAC Main 主规格

           MPEG-2 AAC SSR 可变采样率规格(Scaleable Sample Rate)

           MPEG-4 AAC LC 低复杂度规格(Low Complexity)------现在的手机比较常见的MP4文件中 的音频部份就包括了该规格音频文件

           MPEG-4 AAC Main 主规格 ------包含了除增益控制之外的全部功能,其音质最好

           MPEG-4 AAC SSR 可变采样率规格(Scaleable Sample Rate)

           MPEG-4 AAC LTP 长时期预测规格(Long Term Predicition)

          MPEG-4 AAC LD 低延迟规格(Low Delay)

          MPEG-4 AAC HE 高效率规格(High Efficiency)-----这种规格适合用于低码率编码,有Nero ACC 编码器支持

                 目前使用最多的是LC和HE(适合低码率)。流行的Nero AAC编码程序只支持LC,HE,HEv2这三种规格,编码后的AAC音频,规格显示都是LC。HE其实就是AAC(LC)+SBR技术,HEv2就是AAC(LC)+SBR+PS技术;

     

       

     

    AAC音频文件(传输流)格式有ADIF和ADTS:
  • ADIF:Audio Data Interchange Format 音频数据交换格式。这种格式的特征是可以确定的找到这个音频数据的开始,不需进行在音频数据流中间开始的解码,即它的解码必须在明确定义的开始处进行。故这种格式常用在磁盘文件中。
  • ADTS:Audio Data Transport Stream 音频数据传输流。这种格式的特征是它是一个有同步字的比特流,解码可以在这个流中任何位置开始。它的特征类似于mp3数据流格式。

adts_fixed_header();固定的头部

adts_variable_header();可变的头部

 

syncword :同步头 总是0xFFF, all bits must be 1,代表着一个ADTS帧的开始

ID:MPEG标识符,0标识MPEG-4,1标识MPEG-2

Layer:always: '00'

protection_absent:表示是否误码校验。Warning, set to 1 if there is no CRC and 0 if there is CRC

profile:表示使用哪个级别的AAC,如01 Low Complexity(LC)--- AAC LC。有些芯片只支持AAC LC 。

在MPEG-2 AAC中定义了3种:

FFmpeg之音频封装格式、音频编解码器

sampling_frequency_index:表示使用的采样率下标,通过这个下标在 Sampling Frequencies[ ]数组中查找得知采样率的值。

channel_configuration: 表示声道数 

frame_length : 一个ADTS帧的长度包括ADTS头和AAC原始流.

adts_buffer_fullness:0x7FF 说明是码率可变的码流

 

在AAC中,原始数据块的组成可能有六种不同的元素:

       SCE: Single Channel Element单通道元素。单通道元素基本上只由一个ICS组成。一个

           原始数据块最可能由16个SCE组成。

       CPE: Channel Pair Element 双通道元素,由两个可能共享边信息的ICS和一些联合立体

            声编码信息组成。一个原始数据块最多可能由16个SCE组成。

       CCE: Coupling Channel Element 藕合通道元素。代表一个块的多通道联合立体声信息

           或者多语种程序的对话信息。

       LFE: Low Frequency Element 低频元素。包含了一个加强低采样频率的通道。

       DSE: Data Stream Element 数据流元素,包含了一些并不属于音频的附加信息。

       PCE: Program Config Element 程序配置元素。包含了声道的配置信息。它可能出现在

            ADIF 头部信息中。

       FIL: Fill Element 填充元素。包含了一些扩展信息。如SBR,动态范围控制信息等。

 

 

 

术语说明:

AAC: Advanced Audio Coding 高级音频编码

AAC LC: AAC with Low Complexity AAC的低复杂度配置

AAC plus: 也叫HE-AAC, AAC+,MPEG4 AAC LC加入SBR模块后形成的一个AAC版本

MPEG:Motion Picture Expert Group

IMDCT:反离散余弦变换

ADIF:Audio Data Interchange Format 音频数据交换格式

ADTS:Audio Data Transport Stream 音频数据传输流

SCE: Single Channel Element单通道元素

CPE: Channel Pair Element 双通道元素

CCE: Coupling Channel Element 藕合通道元素

DSE: Data Stream Element 数据流元素

PCE: Program Config Element 程序配置元素

FIL: Fill Element 填充元素

ICS: Individual Channel Stream 独立通道流

PNS: Perceptual Noise Substitution 知觉噪声替换

SBR: Spectral Band Replication 频段复制

TNS: Temporal Noise Shaping 瞬时噪声整形

ch:channel 通道

PS:parametric stereo 参数立体声

SBR:Spectral Band Replication 频段复制

 

********MP3*********

Layer-3 音频文件,MPEG(Moving Picture Experts Group) 在汉语中译为活动图像专家组,特指活动影音压缩标准,MPEG音频文件是MPEG1 标准中的声音部分,也叫MPEG 音频层,它根据压缩质量和编码复杂程度划分为三层,即Layer-1、Layer2、Layer3,且分别对应MP1、MP2、MP3 这三种声音文件,并根据不同的用途,使用不同层次的编码。MPEG 音频编码的层次越高,编码器越复杂,压缩率也越高,MP1 和MP2 的压缩率分别为4:1 和6:1-8:1,而MP3 的压缩率则高达10:1-12:1,也就是说,一分钟CD 音质的音乐,未经压缩需要10MB的存储空间,而经过MP3 压缩编码后只有1MB 左右。不过MP3 对音频信号采用的是有损压缩方式,为了降低声音失真度,MP3采取了“感官编码技术”,即编码时先对音频文件进行频谱分析,然后用过滤器滤掉噪音电平,接着通过量化的方式将剩下的每一位打散排列,最后形成具有较高压缩比的MP3 文件,并使压缩后的文件在回放时能够达到比较接近原音源的声音效果。

名称 说明
ID3V2

包含了作者,作曲,专辑等信息,长度不固定,扩展了ID3V1的信息量。

音频数据

1.音频数据由一系列的数据帧帧构成,个数由文件大小和帧长决定

2.每个FRAME的长度可能不固定,也可能固定,由位率bitrate决定

3.每个FRAME又分为帧头和数据实体两部分

4.帧头记录了mp3的位率,采样率,版本等信息,每个帧之间相互独立

5.如果启用CRC校验,则帧头后面跟着2字节CRC校验,之后存在两字节的附加信息,也可能无附加是信息。

ID3V1 包含了作者,作曲,专辑等信息,长度固定为128字节。

ID3V2.

每个ID3V2.3 都一个标签头和若干个标签帧或一个扩展标签头组成关于曲目的信息如标题、作者等都存放在不同的标签帧中,扩展标签头和标签帧并不是必要的,但每个标签至少要有一个标签帧。标签头和标签帧一起顺序存放在MP3 文件的首部。

标签头:位于文件开始处,长度为10字节,结构如下:

   
char Header[3]   必须为“ID3”否则认为标签不存在
char Ver 版本号ID3V2.3 就记录3
char Revision 副版本号此版本记录为0
char Flag

标志字节,只使用高三位,其它位为0,

标志字节一般为0,定义如下(abc000000B)

a:表示是否使用Unsynchronisation

b:表示是否有扩展头部,一般没有,所以一般也不设置

c:表示是否为测试标签,99.99%的标签都不是测试标签,不设置

char Size[4] 标签大小,包括标签头的10 个字节和所有的标签帧的大小,

标签大小共四个字节,每个字节只使用低7位,最高位不使用恒为0,计算时将最高位去掉,得到28bit的数据,计算公式如下:

Size=(Size[0]&0x7F)*0x200000+(Size[1]&0x7F)*0x400+(Size[2]&0x7F)*0x80+(Size[3]&0x7F)

 

标签帧:每个标签帧都有10个字节的帧头(和标签头不是一个东西,虽然他们刚好都是10字节,标签头只有一个,每个标签帧都有一个帧头)和至少一个字节的内容构成,标签帧与标签头/其他标签帧无特殊字节分割,只能通过帧头信息来确定帧内容的大小。

标签帧的帧头结构:

   
char ID[4]

标识帧,说明其内容,例如作者/标题等,

用四个字符标识一个帧,说明一个帧的内容含义,常用的对照如下: 

TIT2=标题表示内容为这首歌的标题,下同 

TPE1=作者

TALB=专集

TRCK=音轨格式:N/M 其中N 为专集中的第N 首,M为专集*M 首,N和M 为ASCII 码表示的数字 

TYER=年代是用ASCII 码表示的数字 

TCON=类型直接用字符串表示 

COMM=备注格式:"eng\0备注内容",其中eng 表示备注所使用的自然语言

char Size[4]

帧内容的大小,不包括帧头,不得小于1,每个字节的8 位全用,

算法如下: 

int FSize; 

FSize = Size[0]*0x100000000 + Size[1]*0x10000+ Size[2]*0x100 + Size[3]; 

第5到8字节为标签帧的大小,这里为

FSize = 0x00*0x100000000+ 0x00*0x10000 + 0x00*0x100 + 0x24 = 0x24 = 36

char Flags[2]

标志帧,只定义了6 位,另外的10 位为0,但大部分的情况下16 位都为0 就可以了。格式如下: 

abc00000ijk00000 

a -- 标签保护标志,设置时认为此帧作废

b -- 文件保护标志,设置时认为此帧作废

c -- 只读标志,设置时认为此帧不能修改(但我没有找到一个软件理会这个标志) 

i -- 压缩标志,设置时一个字节存放两个BCD 码表示数字 

j -- 加密标志(没有见过哪个MP3 文件的标签用了加密) 

k -- 组标志,设置时说明此帧和其他的某帧是一组

注意:winamp 在保存和读取帧内容的时候会在内容前面加个''\0'',并把这个字节计算在帧内容的大小中。

   
   

MP3音频数据(除了ID3v2和ID3v1之外的数据)

MP3的帧格式:每个帧都有一个帧头Header,长度是4Byte(32bit),帧头后面可能有两个字节的CRC 校验值,这两个字节的是否存在决定于Header 信息的第16bit,为0 则帧头后面无校验,为1 则有校验,校验值长度为2 个字节,紧跟在Header 后面,接着就是帧的实体数据了。

名称 长度(Byte) 属性
帧头 4 必存在
CRC 2 可能存在
通道信息 32 必存在
声音数据 N 必存在

        帧头:帧头长4字节,对于固定位率的MP3文件,所有帧的帧头格式一样,如下:

名称

位长

说          明

同步信息

11

第1、2字节

所有位均为1,第1字节恒为FF。

版本

2

00-MPEG 2.5   01-未定义     10-MPEG 2     11-MPEG 1

2

00-未定义      01-Layer 3     10-Layer 2      11-Layer 1

CRC校验

1

0-校验        1-不校验

位率

4

第3字节

 取样率,单位是kbps,例如采用MPEG-1 Layer 3,64kbps是,值为0101。

bits

V1,L1

V1,L2

V1,L3

V2,L1

V2,L2

V2,L3

0000

free

free

free

free

free

free

0001

32

32

32

32(32)

32(8)

8 (8)

0010

64

48

40

64(48)

48(16)

16 (16)

0011

96

56

48

96(56)

56(24)

24 (24)

0100

128

64

56

128(64)

64(32)

32 (32)

0101

160

80

64

160(80)

80(40)

64 (40)

0110

192

96

80

192(96)

96(48)

80 (48)

0111

224

112

96

224(112)

112(56)

56 (56)

1000

256

128

112

256(128)

128(64)

64 (64)

1001

288

160

128

288(144)

160(80)

128 (80)

1010

320

192

160

320(160)

192(96)

160 (96)

1011

352

224

192

352(176)

224(112)

112 (112)

1100

384

256

224

384(192)

256(128)

128 (128)

1101

416

320

256

416(224)

320(144)

256 (144)

1110

448

384

320

448(256)

384(160)

320 (160)

1111

bad

bad

bad

bad

bad

bad

V1 - MPEG 1    V2 - MPEG 2 and MPEG 2.5
L1 - Layer 1     L2 - Layer 2     L3 - Layer 3
"free" 表示位率可变    "bad"  表示不允许值

采样频率

2

采样频率,对于MPEG-1:  00-44.1kHz    01-48kHz    10-32kHz      11-未定义

          对于MPEG-2:  00-22.05kHz   01-24kHz    10-16kHz      11-未定义

          对于MPEG-2.5: 00-11.025kHz 01-12kHz    10-8kHz       11-未定义

帧长调节

1

用来调整文件头长度,0-无需调整,1-调整,具体调整计算方法见下文。

保留字

1

没有使用。

声道模式

2

第4字节

表示声道, 00-立体声Stereo    01-Joint Stereo    10-双声道        11-单声道

扩充模式

2

当声道模式为01是才使用。

Value

强度立体声

MS立体声

00

off

off

01

on

off

10

off

on

11

on

on

版权

1

文件是否合法,0-不合法   1-合法

原版标志

1

是否原版,    0-非原版   1-原版

强调方式

2

用于声音经降噪压缩后再补偿的分类,很少用到,今后也可能不会用。

00-未定义     01-50/15ms     10-保留       11-CCITT J.17

MP3帧长取决于位率和频率,

计算帧长度 

我们首先区分两个术语:帧大小和帧长度。帧大小即每帧采样数表示一帧中采样的个数,这是恒定值。其值如下表所示 

 

MPEG 1

MPEG 2(LSF)

MPEG 2.5(LSF)

Layer 1

384

384

384

Layer 2

1152

1152

1152

Layer 3

1152

576

576

帧长度是压缩时每一帧的长度,包括帧头。它将填充的空位也计算在内。LayerI的一个空位长4字节,LayerII和LayerIII的空位是1字节。当读取MPEG文件时必须计算该值以便找到相邻的帧。注意:因为有填充和比特率变换,帧长度可能变化。 

从头中读取比特率,采样频率和填充的值后可以进行计算, 

LyaerI使用公式: 

帧长度(字节) = (( 每帧采样数/ 8 * 比特率 ) / 采样频率 ) + 填充 * 4

LyerII和LyaerIII使用公式: 

帧长度(字节)= (( 每帧采样数/ 8 * 比特率 ) / 采样频率 ) + 填充

例: 

LayerIII 比特率 128000,采样频率 44100,填充0  =〉帧大小 417字节;

如图 2.3中,比特率为128K,采样率为44.1K,填充0,则其帧长度为:

(1152 / 8 * 128K)/44.1K = 417 (字节)

每帧的持续时间 

每帧的持续时间可以通过计算获得,下面给出计算公式 

每帧持续时间(毫秒) = 每帧采样数 / 采样频率 * 1000

如图 2.3中,其每帧时间为:

1152 / 44.1K * 1000 = 26.12 (约等于26ms)

如果是MPEG2 Layer III 采样率为16KHz的话那一帧要持续36毫秒,这个相差还是蛮大的,所以还是应该通过计算来获的。

CRC校验 

如果帧头的校验位为0,则帧头后就有一个16位的CRC值,这个值是big-endian的值,把这个值和该帧通过计算得出的CRC值进行比较就可以得知该帧是否有效。

帧头后面是可变长度的附加信息,对于标准的MP3文件来说,其长度是32字节,紧接其后的是压缩的声音数据,当解码器读到此处时就进行解码了。

对于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,就能快速找出我们需要快进的帧头。

VBR文件头位于MP3文件中第一个有效帧的数据区。有两种格式,一种是常见的XINGHeader(头部包含字符‘Xing’),另一种是VBRIHeader(头部包含字符‘VBRI’)鉴于VBRIHeader不常见,下面只说XINGHeader:

XING Header的起始位置,相对于第一帧帧头的位置,单位是字节 

36-39 "Xing" 文件为MPEG1并且不是单声道(大多数VBR的mp3文件都是如此)

21-24 "Xing" 文件为MPEG1并且是单声道 

21-24 "Xing" 文件为MPEG2并且不是单声道 

13-16 "Xing" 文件为MPEG2并且是单声道

 

 VBR文件头结构:

FFmpeg之音频封装格式、音频编解码器

ID3v1

MP3的结尾,固定128字节;ID3V1 的各项信息都是顺序存放,没有任何标识将其分开,比如标题信息不足30 个字节,则使用''\0''填充。

字节

长度 (字节)

说       明

charHeader[3]

1-3(A)

3

存放“TAG”字符,表示ID3 V1.0标准,紧接其后的是歌曲信息。

charTitle[30]

4-33(B)

30

歌名

charArtist[30]

34-63(C)

30

作者

charAlbum[30]

64-93(D)

30

专辑名

charYear[4]

94-97(E)

4

年份

charComment[28]

98-125(F)

28

附注

charreserve

126(G)

1

保留位

chartrack

127(H)

1

音轨号

charGenre

128(I)

1

MP3音乐类别,共147种。

 

MP3音乐类别:

/* Standard genres */ 
0="Blues"; 
1="ClassicRock"; 
2="Country"; 
3="Dance"; 
4="Disco"; 
5="Funk"; 
6="Grunge"; 
7="Hip-Hop"; 
8="Jazz"; 
9="Metal"; 
10="NewAge"; 
11="Oldies"; 
12="Other"; 
13="Pop"; 
14="R&B"; 
15="Rap"; 
16="Reggae"; 
17="Rock"; 
18="Techno"; 
19="Industrial"; 
20="Alternative"; 
21="Ska"; 
22="Deathl"; 
23="Pranks"; 
24="Soundtrack"; 
25="Euro-Techno"; 
26="Ambient"; 
27="Trip-Hop"; 
28="Vocal"; 
29="Jazz+Funk"; 
30="Fusion"; 
31="Trance"; 
32="Classical"; 
33="Instrumental"; 
34="Acid"; 
35="House"; 
36="Game"; 
37="SoundClip"; 
38="Gospel"; 
39="Noise"; 
40="AlternRock"; 
41="Bass"; 
42="Soul"; 
43="Punk"; 
44="Space"; 
45="Meditative"; 
46="InstrumentalPop"; 
47="InstrumentalRock"; 
48="Ethnic"; 
49="Gothic"; 
50="Darkwave"; 
51="Techno-Industrial"; 
52="Electronic"; 
53="Pop-Folk"; 
54="Eurodance"; 
55="Dream"; 
56="SouthernRock"; 
57="Comedy"; 
58="Cult"; 
59="Gangsta"; 
60="Top40"; 
61="ChristianRap"; 
62="Pop/Funk"; 
63="Jungle"; 
64="NativeAmerican"; 
65="Cabaret"; 
66="NewWave"; 
67="Psychadelic"; 
68="Rave"; 
69="Showtunes"; 
70="Trailer"; 
71="Lo-Fi"; 
72="Tribal"; 
73="AcidPunk"; 
74="AcidJazz"; 
75="Polka"; 
76="Retro"; 
77="Musical"; 
78="Rock&Roll"; 
79="HardRock"; 


 

Winamp扩充了这个表 

80="Folk"; 
81="Folk-Rock"; 
82="NationalFolk"; 
83="Swing"; 
84="FastFusion"; 
85="Bebob"; 
86="Latin"; 
87="Revival"; 
88="Celtic"; 
89="Bluegrass"; 
90="Avantgarde"; 
91="GothicRock"; 
92="ProgessiveRock"; 
93="PsychedelicRock"; 
94="SymphonicRock"; 
95="SlowRock"; 
96="BigBand"; 
97="Chorus"; 
98="EasyListening"; 
99="Acoustic"; 
100="Humour"; 
101="Speech"; 
102="Chanson"; 
103="Opera"; 
104="ChamberMusic"; 
105="Sonata"; 
106="Symphony"; 
107="BootyBass"; 
108="Primus"; 
109="PornGroove"; 
110="Satire"; 
111="SlowJam"; 
112="Club"; 
113="Tango"; 
114="Samba"; 
115="Folklore"; 
116="Ballad"; 
117="PowerBallad"; 
118="RhythmicSoul"; 
119="Freestyle"; 
120="Duet"; 
121="PunkRock"; 
122="DrumSolo"; 
123="Acapella"; 
124="Euro-House"; 
125="DanceHall"; 

其他扩充

126="Goa"; 
127="Drum&Bass"; 
128="Club-House"; 
129="Hardcore"; 
130="Terror"; 
131="Indie"; 
132="BritPop"; 
133="Negerpunk"; 
134="PolskPunk"; 
135="Beat"; 
136="ChristianGangstaRap"; 
137="Heavyl"; 
138="Blackl"; 
139="Crossover"; 
140="ContemporaryChristian"; 
141="ChristianRock"; 
142="Merengue"; 
143="Salsa"; 
144="Trashl"; 
145="Anime"; 
146="JPop"; 
147="Synthpop";

 

实例分析:https://blog.csdn.net/u010650845/article/details/53520426

 

********wma********

wma是微软出的有损压缩,不对外开放,有版权限制,下面是头部解析:

FFmpeg之音频封装格式、音频编解码器

******wav**********

无损格式

RIFF全称为资源互换文件格式(Resources Interchange File Format),RIFF文件是windows环境下大部分多媒体文件遵循的一种文件结构,常见的如WAV文件、AVI文件等。RIFF可以看成一种树状结构,其基本组成单元为LIST和CHUNK,分别如树的节点和叶子。

在RIFF文件中,数据保存的基本单元是CHUNK,可用于保存音视频数据或者一些参数信息,LIST相当于文件系统的目录,可以包含多个CHUNK或者多个LIST。

1 、FOURCC

一个FOURCC(four character code)是一个占4个字节的数据,一般表示4个ASCII字符。在RIFF文件格式中,FOURCC非常普遍,LISTtype, chunkid, 起始标识等信息都是用FOURCC表示的。FOURCC一般是四个字符,如”abcd”这样的形式,也可以三个字符包含一个空格,如”abc ”这样的形式。

2 、CHUNK

一个CHUNK数据块的数据结构如下:

ChunkID    ChunkSize    ChunkData

ChunkID是一个FOURCC,标识该CHUNK的名称,类似于windows文件系统中的文件名。 ChunkSize占用4个字节,表示ChunkData部分的数据内容大小,以字节为单位。ChunkData则是CHUNK中实质性的内容,保存的是CHUNK的具体数据内容。一个CHUNK保存的数据可以是关于声音文件的编码方式、音视频采样等信息,也可以是音频或视频数据。具体表示是哪类数据则通过ChunkID来标识。

3 、LIST

一个LIST数据块的数据结构如下:

“LIST”   ListSize    ListType    ListData

“LIST”也是一个FOURCC,而且是固定的,每个LIST都是以“LIST”为开头。ListSize占用4个字节,表示ListType和ListData两部分加在一起的大小。ListType是一个FOURCC,是对LIST具体包含的数据内容的标识。而ListData则是该LIST的数据内容区,有CHUNK和子LIST组成,它们的个数和组成次序可以是不确定的。

4 、RIFF 文件头

RIFF文件头的数据结构如下:

“RIFF”   FileSize   FileType   FileData

“RIFF”也是一个FOURCC,用于标识该文件是一个RIFF格式的文件。FileSize是一个4字节的数据,给出文件的大小,但仅包括FileType和FileData两部分。FileType是一个FOURCC,用来说明文件类型,如”WAV”, “AVI”等。FileData部分表示文件的具体内容,可以是LIST也可以是CHUNK.

wav通常用来保存PCM格式的原始音频数据,所以通常被称为无损音频。但是严格意义上来讲,WAV也可以存储其它压缩格式的音频数据。WAV文件遵循RIFF规则,其内容以区块(chunk)为最小单位进行存储。WAV文件一般由3个区块组成:RIFF chunkFormat chunk、Fact Chunk(可选)和Data chunk。另外,文件中还可能包含一些可选的区块,如:Fact chunkCue points chunkPlaylist chunkAssociated data list chunk等。

每个文件最前端写入的是RIFF块,每个文件只有一个RIFF块。从 Wave文件格式详细说明 中可以看到这一点。

非PCM格式的文件会至少多加入一个 "fact" 块,它用来记录数据(注意是数据而不是文件)解压缩后的大小。这个 "fact" 块一般加在 "data" 块的前面。

wav常见的结构:

FFmpeg之音频封装格式、音频编解码器

RIFF区块

名称 偏移地址 字节数 端序 内容
ID 0x00 4Byte 大端 'RIFF' (0x52494646),以'RIFF'为标识
Size 0x04 4Byte 小端 fileSize - 8,Size是整个文件的长度减去IDSize的长度
Type 0x08 4Byte 大端 'WAVE'(0x57415645),TypeWAVE表示后面需要两个子块:Format区块和Data区块

FORMAT区块

名称 偏移地址 字节数 端序 内容
ID 0x00 4Byte 大端 'fmt ' (0x666D7420),以'fmt '为标识
Size 0x04 4Byte 小端 16,Size表示该区块数据的长度(不包含IDSize的长度)
AudioFormat 0x08 2Byte 小端 音频格式,AudioFormat表示Data区块存储的音频数据的格式,PCM音频数据的值为1
NumChannels 0x0A 2Byte 小端 声道数,NumChannels表示音频数据的声道数,1:单声道,2:双声道
SampleRate 0x0C 4Byte 小端 采样率,SampleRate表示音频数据的采样率
ByteRate 0x10 4Byte 小端 每秒数据字节数,ByteRate每秒数据字节数 = SampleRate * NumChannels * BitsPerSample / 8
BlockAlign 0x14 2Byte 小端 数据块对齐,BlockAlign每个采样所需的字节数 = NumChannels * BitsPerSample / 8
BitsPerSample 0x16 2Byte 小端 采样位数,BitsPerSample每个采样存储的bit数,8:8bit,16:16bit,32:32bit

 NumChannels SampleRate BitsPerSample 三个参数最重要,其它的都是依据这三个计算出来的。

Fact

在非PCM格式的文件中(即压缩编码文件),一般会在WAVEFORMAT结构后面加入一个 "fact" chunk。

常见的压缩编码格式:

格式代码 格式名称 fmt 块长度 fact 块
1(0x0001) PCM/非压缩格式 16  
2(0x0002 Microsoft ADPCM 18
3(0x0003) IEEE float 18
6(0x0006) ITU G.711 a-law 18
7(0x0007) ITU G.711 μ-law 18
49(0x0031) GSM 6.10 20
64(0x0040) ITU G.721 ADPCM  
65,534(0xFFFE) 见子格式块中的编码格式 40  

 

 DATA区块

名称 偏移地址 字节数 端序 内容
ID 0x00 4Byte 大端 'data' (0x64617461),以'data'为标识
Size 0x04 4Byte 小端 N,Size表示音频数据的长度,N = ByteRate * seconds
Data 0x08 NByte 小端 音频数据,

WAV文件以小端形式来进行数据存储。

所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。

 

******flac********

https://blog.csdn.net/yu_yuan_1314/article/details/9491763

block、subblock 指没有被编码的原始数据;frame、subframe指编码后的数据;

Block:一组或多组跨所有声道的采样点(flac采样组数范围16~65535)。

Subblock:一个或多个单声道的采样点,一个Block包含几个声道就有几个subblock,同个block内subblock的采样点数相同。

Blocksize:一个block中任意subblock的采样点个数(与声道数无关)。

Frame:一个frame帧头加一个或多个Subframe

Subframe:一个subframe帧头加某一声道上一个或多个编码后的采样点,一个frame中的所有subframe包含的采样点数一样。

(每次一个subblock被编码成一个subframe,多个subframe组成一个frame)

Flac中所有数值都是整形,大端模式,除非特别指出,否则数值都是unsigned的。

Flac比特流以“fLaC”开始,接着是必须的metadata块(STREAMINFO),然后是其他可选的metadata块,接着是音频帧。

Flac最多可以支持到128类metadata,已经定义的包括下面几种:

A.   STREAMINFO:包含整个比特流的一些信息,如采样率、声道数、采样总数等。他一定是第一个metadata而且必须有。之后可以接其他metadata,这些metadata可以不用识别直接跳过。

B. APPLICATION:包含第三方应用软件信息,这个段里的32位识别码是flac维护组织提供的,是唯一的。

C. PADDING:没有意义的东西,主要用来后期添加其他metadata。

D. SEEKTABLE:保存快速定位点,一个点由18bytes组成(2k就可以精确到1%的定位),表里可以有任意多个定位点。

E.  VORBIS_COMMENT:存储了一系列可读的“名/值”的键值对,使用UTF-8编码。这是flac唯一官方支持的标签段。

F.  CUESHEET:存储用在cue sheet中的各种信息。可以用来划分音轨,在备份CD时十分有用。

G. PICTURE:保存相关图片,同时还有url、分辨率等信息,可以有不止一个picture block。

 

FLAC文件结构:

Field Name 

Length(bit)

Description

文件标记”fLaC”

32

“fLaC”, 文件标记,0x66 0x41 0x61 0x43

METADATA BLOCK

34*8

STREAMINFO,必选的metadata block,说明Stream的基本特性。

METADATA BLOCK

 

一个或者多个metadata block,可选。

AUDIO FRAMES

 

一个或者多个Audio Frame

 Metadata block结构:

Field Name

L(bit)

Description

METADATA

BLOCK

HEADER

 

1

‘1’表示是最后一个metadata

BLOCK TYPE

7

0 : STREAMINFO

1 : PADDING

2 : APPLICATION

3 : SEEKTABLE

4 : VORBIS_COMMEN

5 : CUESHEET

6 : PICTURE

7-126 : reserved

127 : 无效

BLOCK SIZE

24

数据长度,不包括header,单位byte

METADATA

BLOCK

DATA

STREAMINFO

16

最小的block size,单位sample

16

最大的block size,单位sample

24

最小的frame size,单位byte,0表示未知

24

最大的frame size,单位byte,0表示未知

20

采样率(Hz)

3

声道数减一,flac支持1~8个声道

5

采样位数减一,flac支持4~32位采

样位数

36

一个声道的总采样数,0表示未知

128

未编码时的原始信号的MD5信息

PADDING

N

N必须为8的倍数,目前设置为0

APPLICATION

32

应用程序ID

N

应用程序数据,N必须是8的倍数

SEEK

TABLE

多个

SEEK

POINT

64

目标帧中第一个sample的序号

64

相对于第一帧开始的偏移(byte)

16

目标帧中的采样数

VORBIS COMMENT

N

Vorbis comment packet的内容

CUESHEET

HEADER

128*8

媒体目录号,ASCII为0x20-0x7e

64

引导sample的个数

1

1表示CUESHEET对应一个Compact Disc

7+258*8

Reserved

8

Track的个数

多个

TRACK

HEADER

64

Track偏移量,单位sample

8

Track号

12*8

TrackISRC

1

Track类型:0 音乐 1非音乐

1

pre-emphasis标记

6+13*8

Reserved

8

索引数目

多个

INDEX

64

偏移,单位sample

8

索引号

3*8

Reserved

PICTURE

32

图片类型(同ID3v2 APIC)

0 - Other

1- 32x32 pixels 'file icon' (PNG only)

2 - Other file icon

3 - Cover (front)

4 - Cover (back)

5 - Leaflet page

6 - Media (e.g. label side of CD)

7 - Lead artist/lead performer/soloist

8 - Artist/performer

9 - Conductor

10 - Band/Orchestra

11 - Composer

12 - Lyricist/text writer

13 - Recording Location

14 - During recording

15 - During performance

16 - Movie/video screen capture

17 - A bright coloured fish

18 - Illustration

19 - Band/artist logotype

20 - Publisher/Studio logotype

32

MIME类型字符长度(byte)

N*8

MIME类型

32

描述符长度(byte)

N*8

描述符UTF-8

32

图片宽度

32

图片高度

32

图片颜色深度

32

索引图使用的颜色数目,0非索引图

32

图片数据长度

N*8

图片数据

 

音频数据由一个或多个音频帧组成.

Audio Frame结构:

 

Field Name

L(bit)

Description

FRAME HEADER

14

同步字,'11111111111110'

1

0 : 强制值,1 : 保留未来使用

1

分块策略,0:固定块大小,帧头包含帧的序号

1:块大小可变,帧头包含采样点序号

4

块内的采样数

0000 : reserved

0001 : 192 samples

0010-0101 : 576 * (2^(n-2)) samples

0110 : get 8 bit (blocksize-1) from end of header

0111 : get 16 bit (blocksize-1) from end of header

1000-1111:256 * (2^(n-8)) 采样点

4

采样率

0000 : get from STREAMINFO metadata block

0001 : 88.2kHz     0010 : 176.4kHz

0011 : 192kHz      0100 : 8kHz

0101 : 16kHz       0110 : 22.05kHz

0111 : 24kHz       1000 : 32kHz

1001 : 44.1kHz      1010 : 48kHz

1011 : 96kHz

1100 : 从header end 获得8位的比特率(kHz) 

1101 : 从header end 获得16位的比特率(Hz)

1110 : 从header end 获得16位的比特率(ten Hz)

1111 : invalid, to prevent sync-fooling string of 1s

4

0000-0111 :独立声道减一,分配如下:

1 channel: mono

2 channels: left, right

3 channels: left, right, center

4 channels: left, right, back left, back right

5 channels: left, right, center, back/surround left, back/surround right

6 channels: left, right, center, LFE, back/surround left, back/surround right

7 channels、8 channels: not defined

1000 : left/side stereo: channel 0是left channel, channel 1是side channel

1001 : right/side stereo: channel 0 是 side channel, channel 1是right channel

1010 : mid/side stereo: channel 0 是mid channel, channel 1是side channel

1011-1111 : reserved

3

采样深度

000 : get from STREAMINFO metadata block

001 : 8 bits per sample   010 : 12 bits per sample

011 : reserved          100 : 16 bits per sample

101 : 20 bits per sample  110 : 24 bits per sample

111 : reserved

1

0 : 强制值,1 : 保留未来使用

if(variable blocksize) 

<8-56>:"UTF-8" coded sample number (decoded number is 36 bits)

else 

<8-48>:"UTF-8" coded frame number (decoded number is 31 bits)

if(blocksize bits == 011x)   8/16 bit (blocksize-1)

if(sample rate bits == 11xx)  8/16 bit sample rate

8

CRC-8

SUBFRAME

SUBFRAME HEADER

1

填充0,prevent sync-fooling string of 1s

6

Subframe类型

000000 : SUBFRAME_CONSTANT

000001 : SUBFRAME_VERBATIM

00001x : reserved

0001xx : reserved

001xxx : if(xxx <= 4) SUBFRAME_FIXED, xxx=order ; else reserved

01xxxx : reserved

1xxxxx : SUBFRAME_LPC, xxxxx=order-1

1+k

'Wasted bits-per-sample' flag

0 : no wasted bits-per-sample in source subblock, k=0

1 : k wasted bits-per-sample in source subblock, k-1 follows, unary coded;

e.g. k=3 => 001 follows, k=7 => 0000001 follows.

SUBFRAME CONSTANT

N

N = Bits per Sample

SUBFRAME

FIXED

 

N

N = Bits per Sample * Predictor Order

RESIDUAL

 

Encoded Residual

SUBFRAME

LPC

 

N

N = Bits per Sample * Lpc Order

 

4

 

 

5

 

 

N

 

RESIDUAL

 

Encoded Residual

SUBFRAME VERBATIM

N*I

N = Bits per Sample,I = Block Size

 

填充0以实现对齐

FRAME FOOTER

16

CRC-16

 

*******aiff***********

http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/AIFF/AIFF.html

AIFF是由美国APPLE公司开发的无损音频格式,是Apple苹果电脑上面的标准音频格式,属于QuickTime技术的一部分。AIFF格式只能包含未经压缩的PCM格式的音频数据, AIFF文件包含以下几个区块(Chunk):Common Chunk (必需),Sound Data Chunk (必需),Marker Chunk,Instrument Chunk,Comment Chunk,Name Chunk,Author Chunk,Copyright Chunk,Annotation Chunk,Audio Recording Chunk,MIDI Data Chunk,Application Chunk,ID3 Chunk。

每个区块(Chunk)基本结构:

Chunk ID

Chunk size

data

 

 

 

音频编解码协议

*******MP3*************

MP3的解码总体上可分为9个过程:比特流分析,霍夫曼编码,逆量化处理,立体声处理,频谱重排列,抗锯齿处理,IMDCT变换,子带合成,PCM输出。

 

********AAC**********

编解码流程:https://www.cnblogs.com/fellow1988/p/7545881.html

 

 

上一篇:最好用的多功能视频处理软件:VideoProc 4K for Mac


下一篇:自动驾驶需要哪些关键技术?