3. 【音频编码原理】
原理:
- 消除冗余信息,压缩量最大,也叫有损压缩
-
剔除人耳听觉范围外的音频信号20Hz以下和20000Hz以上;
-
去除被掩蔽的音频信号,信号的遮蔽可以分为频域遮蔽和时域遮蔽;
-
频域遮蔽效应
屏蔽70分贝以下,20HZ以下,20000HZ以上
屏蔽分贝小,频率小的声音
两个频率相近发出的声音,去除低强度的,也就是分贝高的会盖住分贝低的
- 时域遮蔽效应:
根根时间推移,相近频率且同时出现的声音,声音强度高的遮蔽强度低的声音,并且去除同一时间段前后杂音,前遮蔽50毫秒,后遮蔽200毫秒,在这段时间内的声音,强度越接近就越会被屏蔽。
- 去除冗余信息后,再进行无损压缩;
- 无损压缩就是压缩后的数据能够解压缩进行还原,有损则不能;
- 熵编码中有
哈夫曼编码:用一个很小的二进制数代替一个长的字符串,频率越高,编码越小,频率越低,编码越长
算术编码:利用小数进行编码,在香农编码的基础改进而来的
香农编码
音频编码过程
http://img.mukewang.com/szimg/6085873f096e726d09480542.jpg数据先同时通过 时域转频域变换器和心理学模型处理数据,前者将数据转换成多种频段的数据,然后剔除不需要的频段数据,后者会去除非人耳听到的范围声音和一些复合声音,最后将两者合并经过量化编码,无损编码之类的,形成比特流数据,在此之前还会有一些辅助数据,此后数据就会变得非常小;
常见的音频编码器
编码质量比较 码率比较opus、aac、Ogg、Speex、iLBC、AMR、G.711, 最常用的编码器是opus aac。
opus常用于直播,尤其是无延迟的直播,webrtc默认使用opus;
AAC是应用最广泛的编解码;
Ogg收费;
Speex支持回音消除;
G.711一般用于固定电话,声音损耗严重,通话会失真;
AAC比较适合有一定延迟的直播,AAC-LD属于低延迟编码器
- AAC编码器:目前应用最广泛,如iOS、安卓和其他嵌入式设备都包含了AAC硬件编解码器,主要学习这个编码器;
用来取代mp3,比mp3更高的压缩比和保真性更强;
常用的规格有AAC LC、AAC HE V1 、AAC HE V2三种;
AAC规格关系图AAC HE V1 = AAC + SBR;
AAV HE V2 = AAC + SBR + PS;
目前AAC HE V1 已经被取代 V2 取代了;
V2的码流跟V1的差别不是很大,根据声音的数据变化,如果两个声道的差别很大,码流差别就会越小;
AAC 中header有两种格式:
就相当于在aac数据前面加了个Header,header里面就会包含aac数据的一些信息,方便进行编解码
- ADIF(Audio data interchange format): 特点是只能从头开始解码,可以确定的找到音频数据的开始部分,不能从音频数据中间开始,这种格式常用于磁盘文件中;
- ADTS(Audio Data Transport Format):在每一帧的数据里面都会有一个同步字,也就是每帧都有一个header,所以他可以在任意的位置开始进行解码,就像流式数据;
- ADTS结构: 由7-9个字节组成,通常情况下是7个字节,如果有CRC 就是9个字节,字节中的每一位都有独特的含义;
-
1~12bit:全部是1也就是0xFFF,表示是同步字;
-
13:编码规范 0 = MPEG-4 1 = MPEG-2;
-
14~15:总是0;
-
16:是否有保护 1 代表 没有 CRC 0 代表有CRC;
-
17~18:表示的是MPEG-4的音频类型:AAC LC、 AAC HE V1 、AAC HE V2
-
19~22:表示的是采样率
-
24~26:通道数
-
31~33:数据长度,也包括了header的长度
-
-
剩余的之后补上
image.png
其中每一十进制数对应的含义:
Audio Object Type: 在代码中实际获取类型的时候需要进行+1,才是下面的类型
1 == AAC main
2 == AAC LC
5 == SBR == HE V1
29 == ps == HE V2
其中的采样率是通过十进制数表示的一个采样率,有一个表,比如:0 == 96000Hz 1 == 88200HZ 等
通过网址 可以更详细看到其中的含义