本文章根据慕课网李超老师的音视频课程和https://blog.csdn.net/ty13392186270/article/details/106993477
本文讨论以下几个问题
1、为什么音频需要编码?
2、音频压缩分为几种?每种压缩的特点?
3、如何消除冗余信息?
4、什么是频域遮蔽和时域遮蔽?
5 无损压缩采用的编码有哪些?哈夫曼树是什么?
6、常见的音频编码器?
7、AAC编码器?
8、ffmpeg生成aac?ffmpeg生成opus
1、为什么音频需要编码?
录制出来的原始数据数据量很大,不利于网络传输,所以要进行音频编码。
2、音频压缩分为几种?每种压缩的特点?
音频压缩分为有损压缩和无损压缩
有损压缩就是无法恢复的压缩,比如音频去除冗余信息和被屏蔽掉的信息。因为已经去除,所以不可以恢复。
无损压缩就是对数据进行压缩后还可以原样恢复的的压缩。 比如 rar tar gzip zip 7z等。
音频压缩的流程
音频->去除冗余信息(有损压缩)->无损压缩 ->压缩包。生成压缩包就可以在网络上进行传输了。
3、如何消除冗余信息?
对于音频哪些是冗余信息?
- 人类可以听到的范围是20-20000hz的频率的声音,<20和>20000hz的都是冗余信息
- 被遮蔽掉的信息
去掉冗余信息的方式有两种频域遮蔽和时域遮蔽。
4、什么是频域遮蔽和时域遮蔽?
图1
图1当中横轴是频率,纵轴是声音强度
①静音门槛曲线下方的声音我们是听不到的,所以应该去除
②图中遮蔽源的声音,会将它旁边的声音进行遮蔽,这个我们也是听不到的。如果声音的强度比遮蔽源的强度低,但是离遮蔽源的频率远一些(低和高都行),那么也是不会遮蔽的。
图2
时域遮蔽:随着时间的推移,它是如何产生遮蔽效应的。横轴是时间,纵轴是声音强度,图2所示,0-200,同时有很多声音进来,声强的会压住声弱的。声强之前的声音也会被屏蔽掉。在50毫秒内,越靠近这个人说话,越会被屏蔽掉。对于后面的屏蔽更长了,达到了200毫秒,你超过它,你就把前面的声音给屏蔽掉了,就看图2后屏蔽。
总结
根据时域和频域遮蔽效应哪些被屏蔽掉
- 低于20hz或者高于2Whz的被屏蔽掉
- 声音强度很小的,也被屏蔽掉了
- 同时说话,声音强度大的压制声音强度小的
- 同一频率,声音强度大的压制声音强度小的
- 不同频率,他们之间的影响会小很多
5 无损压缩采用的编码有哪些?哈夫曼树是什么?
无损压缩用到熵编码
熵编码
- 哈夫曼编码 每一个叶子节点代表一个编码
- 算术编码
- 香农编码
哈夫曼树如何理解
https://baijiahao.baidu.com/s?id=1664724684084187981&wfr=spider&for=pc 这篇文章写的很好,可以大体明白。
6、常见的音频编码器?
OPUS AAC Ogg Speex iLBC AMR G.711等
编码器 | 特点 | 应用范围 |
OPUS | 延迟小,压缩率高,网络宽带适应性好 | 视频会议,WebRTC |
AAC | 全带音频,延迟高 | 使用最广泛,android,ios,ffmpeg都在大量使用,直播系统中使用广泛 |
Ogg | 收费 | |
Speex | 回音消除 | |
G.711 | 数据小,声音损耗大 | 固话 |
网上测评效果 OPUS >AAC>Ogg
各种编码适应的宽带类型
可以看到Opus是适应的所有的宽带。目前移动设备使用的aac只在全宽带。对网络的要求还是比较高。
音频编码码率
可以从图中看出opus延时小,码率范围大。aac延迟大,码率还可以。
7、AAC编码器?
为了取代mp3,mp3压缩率还是比较低
aac压缩率好于mp3,还原性比较好。
最开始是基于MPEG-2开发。MPEG-4标准推出后,AAC又加入了MPEG-4的特性,加入了SBR技术和PS技术。
目前常用的规格 AAC LC 、AAC HE V1、AAC HE V2
AAC规格
AAC LC:(LOW Complexity)低复杂度规格,码流是128 K, 音质好。
AAC HE V1:等于AAC LC + SBR(Spectral Band Replication)。其核心思想是按频谱分保存。低频编码保存主要成分,高频单独放大编码保存音质,码流在 64 K左右。
AAC HE V2:等于AAC+SPR+PS(Parametric Setreo)。其核心思想是双声道中的声音存在某种相似性,只需存储一个声道的全部信息,然后,花很少的字节用参数描述另一个声道和它不同的地方。码流在 32 K左右
ADIF(Audio Data Interchange Format)
这种格式的特征是可以确定的找到这个音频数据的开始,只能从头开始解码,不能再音频数据流中间开始,这种格式常用在磁盘文件中
ADTS(Audio Data Transport Stream)
这种格式的特征是每一帧都有一个同步字,所以可以在音频流的任何位置开始解码。它类似于数据流格式
下面是来自一个国外网站的介绍。http://wiki.multimedia.cx/index.php?title=ADTS 个人觉得这个网站的这个表结构的说明更加的形象一些。很好理解。1byte = 8 bits , 每个字段占用多少bits,各个字段的意义。
Structure
AAAAAAAA AAAABCCD EEFFFFGH HHIJKLMM MMMMMMMM MMMOOOOO OOOOOOPP (QQQQQQQQ QQQQQQQQ)
Header consists of 7 or 9 bytes (without or with CRC).
Letter Length (bits) Description
A 12 syncword 0xFFF, all bits must be 1
B 1 MPEG Version: 0 for MPEG-4, 1 for MPEG-2
C 2 Layer: always 0
D 1 protection absent, Warning, set to 1 if there is no CRC and 0 if there is CRC
E 2 profile, the MPEG-4 Audio Object Type minus 1
F 4 MPEG-4 Sampling Frequency Index (15 is forbidden)
G 1 private stream, set to 0 when encoding, ignore when decoding
H 3 MPEG-4 Channel Configuration (in the case of 0, the channel configuration is sent via an inband PCE)
I 1 originality, set to 0 when encoding, ignore when decoding
J 1 home, set to 0 when encoding, ignore when decoding
K 1 copyrighted stream, set to 0 when encoding, ignore when decoding
L 1 copyright start, set to 0 when encoding, ignore when decoding
M 13 frame length, this value must include 7 or 9 bytes of header length: FrameLength = (ProtectionAbsent == 1 ? 7 : 9) + size(AACFrame)
O 11 Buffer fullness
P 2 Number of AAC frames (RDBs) in ADTS frame minus 1, for maximum compatibility always use 1 AAC frame per ADTS frame
Q 16 CRC if protection absent is 0
可以通过
https://p23.nl/projects/aac-header/ 用户解析aac的头
audio相应的头信息 https://wiki.multimedia.cx/index.php/MPEG-4_Audio#Audio_Object_Types
8、ffmpeg生成aac?ffmpeg生成opus
生成aac
ffmpeg -i xxx.mp4 -vn -c:a libfdk_aac -ar 44100 -ac 2 -profile:a aac_he_v2 3.aac
生成opus
ffmpeg -i xxx.mp4 -vn -c:a libopus 3.opus