音频压缩
音频压缩技术指的是对原始数字音频信号流(PCM编码)运用适当的数字信号处理技术,在不损失有用信息量,或所引入损失可忽略的条件下,降低(压缩)其码率,也称为压缩编码。它必须具有相应的逆变换,称为解压缩或解码。音频信号在通过一个编解码系统后可能引入大量的噪声和一定的失真。
1、音频信号的冗余信息
数字音频信号如果不加压缩地直接进行传送,将会占用极大的带宽。例如,一套双声道数字音频若取样频率为44.1KHz,每样值按16bit量化,则其码率为:
2*44.1kHz*16bit=1.411Mbit/s
如此大的带宽将给信号的传输和处理都带来许多困难,因此必须采取音频压缩技术对音频数据进行处理,才能有效地传输音频数据。
数字音频压缩编码在保证信号在听觉方面不产生失真的前提下,对音频数据信号进行尽可能大的压缩。数字音频压缩编码采取去除声音信号中冗余成分的方法来实现。所谓冗余成分指的是音频中不能被人耳感知到的信号,它们对确定声音的音色,音调等信息没有任何的帮助。
冗余信号包含人耳听觉范围外的音频信号以及被掩蔽掉的音频信号等。例如,人耳所能察觉的声音信号的频率范围为20Hz~20KHz,除此之外的其它频率人耳无法察觉,都可视为冗余信号。此外,根据人耳听觉的生理和心理声学现象,当一个强音信号与一个弱音信号同时存在时,弱音信号将被强音信号所掩蔽而听不见,这样弱音信号就可以视为冗余信号而不用传送。这就是人耳听觉的掩蔽效应,主要表现在频谱掩蔽效应和时域掩蔽效应,现分别介绍如下:
1.1 频谱掩蔽效应
一个频率的声音能量小于某个阈值之后,人耳就会听不到,这个阈值称为最小可闻阈。当有另外能量较大的声音出现的时候,该声音频率附近的阈值会提高很多,即所谓的掩蔽效应。如图所示:
频率掩蔽效应
由图中我们可以看出人耳对2KHz~5KHz的声音最敏感,而对频率太低或太高的声音信号都很迟钝,当有一个频率为0.2KHz、强度为60dB的声音出现时,其附近的阈值提高了很多。由图中我们可以看出在0.1KHz以下、1KHz以上的部分,由于离0.2KHz强信号较远,不受0.2KHz强信号影响,阈值不受影响;而在0.1KHz~1KHz范围,由于0.2KHz强音的出现,阈值有较大的提升,人耳在此范围所能感觉到的最小声音强度大幅提升。如果0.1KHz~1KHz范围内的声音信号的强度在被提升的阈值曲线之下,由于它被0.2KHz强音信号所掩蔽,那么此时我们人耳只能听到0.2KHz的强音信号而根本听不见其它弱信号,这些与0.2KHz强音信号同时存在的弱音信号就可视为冗余信号而不必传送。
1.2 时域掩蔽效应
当强音信号和弱音信号同时出现时,还存在时域掩蔽效应。即两者发生时间很接近的时候,也会发生掩蔽效应。时域掩蔽过程曲线如图所示,分为前掩蔽、同时掩蔽和后掩蔽三部分。
时域掩蔽效应
由图我们可以看出,时域掩蔽效应可以分成三种:前掩蔽,同时掩蔽,后掩蔽。
- 前掩蔽是指人耳在听到强信号之前的短暂时间内,已经存在的弱信号会被掩蔽而听不到。
- 同时掩蔽是指当强信号与弱信号同时存在时,弱信号会被强信号所掩蔽而听不到。
- 后掩蔽是指当强信号消失后,需经过较长的一段时间才能重新听见弱信号,称为后掩蔽。这些被掩蔽的弱信号即可视为冗余信号。
2、 压缩编码方法
当前数字音频编码领域存在着不同的编码方案和实现方式, 但基本的编码思路大同小异, 如图所示。
数字音频编码系统模型
对每一个音频声道中的音频采样信号,
- 首先都要将它们映射到频域中,这种时域到频域的映射可通过子带滤波器实现。
- 每个声道中的音频采样块首先要根据心理声学模型来计算掩蔽门限值, 然后由计算出的掩蔽门限值决定从公共比特池中分配给该声道的不同频率域中多少比特数,接着进行量化以及编码工作,
- 最后将控制参数及辅助数据加入数据之中,产生编码后的数据流。
几种常见编解码器的比较
常见的音频编码器:OPUS,AAC,Speex,G.711等。
常见的音频编码器特性:
OPUS:延迟小,压缩率高,适合实时通讯,WebRTC默认使用OPUS。
AAC:应用最广泛的一款解码器。
Speex:在前面3个之前是应用广泛的,因为它包含了回音消除这个功能。在之前是很多编解码器不支持的。
G.711系列:用于固话。
1. AAC(Advanced Audio Coding,先进音频编码)
类型:Audio
制定者:MPEG
支持带宽:96-128 kbps
特性:AAC可以支持1到48路之间任意数目的音频声道组合、包括15路低频效果声道、配音/多语音声道,以及15路数据。它可同时传送16套节目,每套节目的音频及数据结构可任意规定。
AAC主要可能的应用范围集中在因特网网络传播、数字音频广播,包括卫星直播和数字AM、以及数字电视及影院系统等方面。AAC使用了一种非常灵活的熵编 码核心去传输编码频谱数据。具有48 个主要音频通道,16 个低频增强通道,16 个集成数据流, 16 个配音,16 种编排。
优点:支持多种音频声道组合,提供优质的音质
缺点:
应用领域:voip
版税方式:一次性收费
备注:AAC于1997年形成国际标准ISO 13818-7。先进音频编码(Advanced Audio Coding--AAC)开发成功,成为继MPEG-2音频标准(ISO/IEC13818-3)之后的新一代音频压缩标准。
在MPEG-2制订的早期,本来是想将其音频编码部分保持与MPEG-1兼容的。但后来为了适应演播电视的要求而将其定义成为一个可以获得更高质量的多声 道音频标准。理所当然地,这个标准是不兼容MPEG-1的,因此被称为MPEG-2 AAC。换句话说,从表面上看,要制作和播放AAC,都需要使用与MP3完全不同的工具。
2. SPEEX
类型:Audio
制定者:Xiph.org
支持采样率:8KHz, 16KHz, 32KHz(对应窄带,宽带,超宽带)
应用领域:voip
编码:Speex编解码器是基于CELP(Code Excited Linear Prediction)激励线性预测编码的,而且专门为2至44kbps的语音压缩而设计的。是有损压缩,通常用0~10范围内的质量参数来控制Speex编码。正常情况下,复杂度为1时噪声级会比复杂度为10时高1~2 dB(分贝),而复杂度为10的CPU需求是复杂度为1的5倍。实践证明,最好将复杂度设置在2~4,设置较高则对非语音编码如双音多频(DTMF)音质较为有用。
3. OPUS
类型:Audio/Music
制定者:Xiph.org
作用:Opus可以处理各种音频应用,包括IP语音、视频会议、游戏内聊天、流音乐、甚至远程现场音乐表演。它可以从低比特率窄带语音扩展到非常高清音质的立体声音乐。
技术标准:https://tools.ietf.org/html/rfc6716
两种声音编码的技术:以语音编码为导向的SILK和低延迟的CELT。Opus可以无缝调节高低比特率。在编码器内部它在较低比特率时使用线性预测编码在高比特率时候使用变换编码(在高低比特率交界处也使用两者结合的编码方式)。
延迟:Opus具有非常低的算法延迟(默认为22.5 ms),非常适合用于低延迟语音通话的编码,像是网上上的即时声音流、即时同步声音旁白等等,此外Opus也可以透过降低编码码率,达成更低的算法延迟,最低可以到5 ms。在多个听觉盲测中,Opus都比MP3、AAC、HE-AAC等常见格式,有更低的延迟和更好的声音压缩率。
版税方式: Opus格式是一个开源免费格式,使用上没有任何专利或限制。
应用领域:voip
特性说明:
- a. 6 kb/秒到510 kb/秒的比特率;单一频道最高256 kb/秒
- b. 采样率从8 kHz(窄带)到48 kHz(全频)
- c. 帧大小从2.5毫秒到60毫秒
- d. 支持恒定比特率(CBR)、受约束比特率(CVBR)和可变比特率(VBR)
- e. 支持语音(SILK层)和音乐(CELT层)的单独或混合模式
- f. 支持单声道和立体声;支持多达255个音轨(多数据流的帧)
- g. 可动态调节比特率,音频带宽和帧大小
- h. 良好的鲁棒性丢失
- i. 浮点和定点实现
AAC编码器介绍
AAC是高级音频编码(Advanced Audio Coding)的缩写,出现于1997年,最初是基于MPEG-2的音频编码技术,目的是取代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。
HE:“High Efficiency”(高效性)。HE-AAC v1(又称AACPlusV1,SBR),用容器的方法实现了AAC(LC)+SBR技术。SBR其实代表的是Spectral Band Replication(频段复制)。简要叙述一下,音乐的主要频谱集中在低频段,高频段幅度很小,但很重要,决定了音质。如果对整个频段编码,若是为了保护高频就会造成低频段编码过细以致文件巨大;若是保存了低频的主要成分而失去高频成分就会丧失音质。SBR把频谱切割开来,低频单独编码保存主要成分,高频单独放大编码保存音质,“统筹兼顾”了,在减少文件大小的情况下还保存了音质,完美的化解这一矛盾。
HEv2:用容器的方法包含了HE-AAC v1和PS技术。PS指“parametric stereo”(参数立体声)。原来的立体声文件文件大小是一个声道的两倍。但是两个声道的声音存在某种相似性,根据香农信息熵编码定理,相关性应该被去掉才能减小文件大小。所以PS技术存储了一个声道的全部信息,然后,花很少的字节用参数描述另一个声道和它不同的地方。
AAC的格式
AAC的音频文件格式有ADIF & ADTS:
-
ADIF:Audio Data Interchange Format 音频数据交换格式
这种格式的特征是可以确定的找到这个音频数据的开始,不需进行在音频数据流中间开始的解码,即它的解码必须在明确定义的开始处进行。故这种格式常用在磁盘文件中。
-
ADTS:Audio Data Transport Stream 音频数据传输流
这种格式的特征是它是一个有同步字的比特流,解码可以在这个流中任何位置开始。它的特征类似于mp3数据流格式。
简单说,ADTS可以在任意帧解码,也就是说它每一帧都有头信息。ADIF只有一个统一的头,所以必须得到所有的数据后解码。这两种的header的格式也是不同的,一般编码后的和抽取出的都是ADTS格式的音频流。
AAC的ADIF文件格式如下图:
AAC的ADTS文件中一帧的格式如下图:
其两边的空白矩形表示一帧前后的数据。
而ADTS的 Header部分分成两部分,固定部分和可变部分
固定部分 adts_fixed_header
- syncword :总是0xFFF, 代表一个ADTS帧的开始, 用于同步.解码器可通过0xFFF确定每个ADTS的开始位置. 因为它的存在,解码可以在这个流中任何位置开始, 即可以在任意帧解码。
- ID:MPEG 版本: 0 代表 MPEG-4,1 代表 MPEG-2
- Layer:总是: '00'
- protection_absent:设置0,进行crc校验,1不进行crc校验,进行crc校验导致固定部分边长成28+16 = 44bits
- profile:表示使用哪个级别的AAC
如01 Low Complexity(LC) -- AAC LC。
注意 profile的值等于 Audio Object Type的值减1.
profile = MPEG-4 Audio Object Type - 1
- sampling_frequency_index:采样率的下标
- channel_configuration:声道数,比如2表示立体声双声道
这里注意,声道数量这里有3个bits表示
其他没有介绍的位都是0,保留
可变部分adts_variable_header
- aac_frame_length 一个ADTS帧的长度包括ADTS头和AAC原始流。就是该帧的总长度。
aac_frame_length = (protection_absent == 1 ? 7 : 9) + size(AACFrame)
- adts_buffer_fullness:0x7FF 说明是码率可变的码流。
- number_of_raw_data_blocks_in_frame:表示ADTS帧中有number_of_raw_data_blocks_in_frame + 1个AAC原始帧。
所以说number_of_raw_data_blocks_in_frame == 0 表示说ADTS帧中有一个AAC数据块。
这里需要注意的是每一个AAC原始帧包含一段时间内1024个采样及相关数据
ADTS 总体结构
AAAAAAAA AAAABCCD EEFFFFGH HHIJKLMM MMMMMMMM MMMOOOOO OOOOOOPP (QQQQQQQQ QQQQQQQQ)
头部分是7字节或者9字节(有crc就是9字节没有就是7字节)
Letter | Length (bits) | Description |
A | 12 | syncword 0xFFF, 所有位数都是1 |
B | 1 | MPEG 版本: 0 代表 MPEG-4, 1 代表 MPEG-2 |
C | 2 | Layer: 总是 0 |
D | 1 | protection absent, 1 代表不用crc,0代表用crc |
E | 2 | profile, MPEG-4 Audio Object Type 减去 1 |
F | 4 | MPEG-4 Sampling Frequency Index |
G | 1 | 私有位置,不会被mpeg适用,编码时候设置0,解码忽略 |
H | 3 | MPEG-4 Channel Configuration (在0的情况下,通过带内的PCE发送通道配置) |
I | 1 | originality, 编码设置0,解码忽略 |
J | 1 | home, 编码设置0,解码忽略 |
K | 1 | copyrighted id bit,编码时候设置0,解码忽略 |
L | 1 | copyright id start, 编码时候设置0,解码忽略 |
M | 13 | frame length,帧长度,该值保护7或者9个字节的头 FrameLength =(ProtectionAbsent == 1?7:9)+ size(AACFrame) |
O | 11 | Buffer fullness ,缓冲充满度 |
P | 2 | ADTS 帧中的AAC帧数-1 为了实现最大的兼容性,每个ADTS帧始终使用一个AAC 也就是说改为始终是0 |
Q | 16 | protection absent 是0, 就有q的位置,是1,就没有q的位置 |
可以通过这个链接AAC header检查来检查你写入的ADTS是否正确。
参考资料
版权声明:本文为CSDN博主「codemanship」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/codemanship/article/details/122752621
暂无评论