语音基础知识: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
一般情况下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技术;
- 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种:
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。
V1 - MPEG 1 V2 - MPEG 2 and MPEG 2.5 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
采样频率 |
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是才使用。
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
版权 |
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文件头结构:
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 */ |
Winamp扩充了这个表 80="Folk"; |
其他扩充 126="Goa"; |
实例分析:https://blog.csdn.net/u010650845/article/details/53520426
********wma********
wma是微软出的有损压缩,不对外开放,有版权限制,下面是头部解析:
******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 chunk
、Format chunk、
Fact Chunk(可选)和Data chunk
。另外,文件中还可能包含一些可选的区块,如:Fact chunk
、Cue points chunk
、Playlist chunk
、Associated data list chunk
等。
每个文件最前端写入的是RIFF块,每个文件只有一个RIFF块。从 Wave文件格式详细说明 中可以看到这一点。
非PCM格式的文件会至少多加入一个 "fact" 块,它用来记录数据(注意是数据而不是文件)解压缩后的大小。这个 "fact" 块一般加在 "data" 块的前面。
wav常见的结构:
RIFF区块
名称 | 偏移地址 | 字节数 | 端序 | 内容 |
---|---|---|---|---|
ID | 0x00 | 4Byte | 大端 | 'RIFF' (0x52494646),以'RIFF' 为标识 |
Size | 0x04 | 4Byte | 小端 | fileSize - 8,Size 是整个文件的长度减去ID 和Size 的长度 |
Type | 0x08 | 4Byte | 大端 | 'WAVE'(0x57415645),Type 是WAVE 表示后面需要两个子块:Format 区块和Data 区块 |
FORMAT区块
名称 | 偏移地址 | 字节数 | 端序 | 内容 |
---|---|---|---|---|
ID | 0x00 | 4Byte | 大端 | 'fmt ' (0x666D7420),以'fmt ' 为标识 |
Size | 0x04 | 4Byte | 小端 | 16,Size 表示该区块数据的长度(不包含ID 和Size 的长度) |
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