文章主要介绍音频编码原理相关内容,分享自己学习中记录的笔记,学习资料为李超老师的《音视频小白系统入门课》。
一、音频压缩
音频压缩主要包括两种:
- 消除冗余信息
- 无损压缩
1.1音频冗余信息
音频压缩技术是在保证信号在听觉方面不产生失真的前提下,对音频数据信号进行尽可能大的压缩。
压缩的主要方法是去除采集到的音频冗余信息。所谓冗余信息包括人耳听觉范围外的音频引号以及被掩蔽掉的音频信号。
信号的遮蔽可以分为频域遮蔽和时域遮蔽。
时域遮蔽,声强高的声音会压着声强低的声音;
总结
:
低于20hz,高于2whz的声音被屏蔽掉;
同时说话时的声音,声音越高会压着声音低;
频率相近,声音越高会压着声音低;
不同频域,相互影响较小。
1.2 无损编码:
常遇到的3种熵编码:
- 哈夫曼编码
- 算数编码
- 香农编码
二、音频编码过程
编码流程:
采集到声音,给时域转频域,分成多个频域,拆除需要的和不需要的数据。心理声学模型去除超出范围的声音(20~2whz)、复杂声音中被遮蔽的声音,之后将需要的数据进行合并,用熵编码等量化编码,形成比特流格式化数据。
常见音视频编解码:
常见的音视频编码器包括OPUS、AAC、Ogg、Speex、iLBC、AMR、G.711等。
其中,AAC在直播系统中应用的比较广泛;OPUS是较新的音编码器,WebRTC默认使用OPUS;固话一般用的G.711系列
网上评测结果:OPUS>AAC>Ogg
OPUS和AAC是两种常见的音频编解码器。它们的特点如下:
1.OPUS编解码器:
- 延迟小 - 压缩率高 - 广泛应用于实时通讯的相关应用,如在线教育、音视频会议等 - 在不同的质量情况下,可以有不同的码流,适应范围广
2.AAC编解码器:
- 音质保真性好 - 压缩率优于MP3 - 应用广泛,用于取代MP3 - 属于全带音频,码流范围在32k以上到128k之间 - 常见于iOS、安卓系统和嵌入式设备中
2.1 AAC编码器
AAC(Advanced Audio Coding)是一种高级音频编码格式,是MPEG-2和MPEG-4标准中的一部分。AAC编码器采用了一系列高级音频处理技术,能够在相对较低的比特率下提供高质量的音频。
AAC编码器以其
高压缩效率、广泛支持、多通道支持和低功耗
等特点,成为了音频编码领域的主流标准,被广泛应用于各种音频传输、存储和播放场景。常用的规格有AAC-LC、AAC-HE 、AAC-HE v2。
1) ADTS格式
ADTS结构
ADTS由7/9个字节组成
各个位:
A 12 3个F,标志头。
B 1 MPEG规范
C总是0
D1——no CRC、0——CRC
E
对应Audio Object Types
编码时需减1。
ADTS格式网址:ADTS
三、ffmpeg进行aac和opus编码
3.1 aac编码
ffmpeg -i xxx.mp4
-vn -c:a libfdk_aac
-ar 44100 -channels 2 -profile:a aac_he_v2 3.aac
ffmpeg -i 输入多媒体文件
-vn (vidio no)
-c:a(制定音频编码器) libfdk_aac(目前性能最好的aac)
-ar(音频采样率) -channels(通道数) -profile(对编码器设置参数):a(指定对音频设置)acc_he_v2(3中格式之一) 3.aac(输出音频文件名字)
进入到ffmpeg
进行aac编码
ffmpeg -i xxx.mp4 -vn -c_a libfdk_aac -ar 44100 -channels 2 -profile:a aac_he_v2 3.aac
播放
ffplay 3.aac
aac各参数详细参考资料:
http://ffmpeg.org/ffmpeg-codecs.html#libfdk_005faac
libdk - AAC库基于来自Android项目的Fraunhofer FDK AAC代码,在配置过程中需要libfdk-aac头文件和库。需要使用——enable-libfdk-aac显式配置构建。
该库与GPL不兼容,所以如果使用GPL,应该配置 --enable-gpl --enable-nonfree --enable-libfdk-aac
。
常用参数选项:
b —— 设置比特率,单位为bits/s。如果没有显式指定比特率,则根据所选配置文件将其自动设置为合适的值。
ar——设置音频采样率(Hz)
channels——设置音频通道的数量
flags +qscale——启用固定质量,VBR(可变比特率)模式。请注意,当VBR值为正值时,VBR是隐式启用的。
profile——设置配置文件,以下为认可的配置文件:
aac_low
:低复杂度AAC (LC)aac_he
:高效AAC (HE-AAC)aac_he_v2
:高效AAC版本2 (HE-AACv2)aac_ld
:低延迟AAC (LD)aac_eld
:增强低延迟AAC (ELD)
如果未指定,则设置为’ aac_low '。
vbr——设置VBR模式,取值范围为1 ~ 5。
1是最低质量(尽管仍然很好),5是最高质量。0表示关闭VBR,使能CBR (Constant Bit Rate)。
目前只有’ aac_low '配置文件支持VBR编码。
VBR模式1-5大致对应以下平均比特率:
1
:32 kbps/channel2
:40 kbps/channel3
:48-56 kbps/channel4
:64 kbps/channel5
:about 80-96 kbps/channel- Default value is 0.
使用ffmpeg将音频文件转换为M4A (MP4)容器中的VBR AAC:
ffmpeg -i input.wav -codec:a libfdk_aac -vbr 3 output.m4a
使用ffmpeg将音频文件转换为CBR 64k kbps AAC,使用高效率AAC配置文件:
ffmpeg -i input.wav -c:a libfdk_aac -profile:a aac_he -b:a 64k output.m4a
3.2 opus编码
ffmpeg -i xxx.mp4 -vn -c_a libopus 1.opus
ffplay 1.opus
就两个参数:
-b 设置码流
-opus_delay:设置延迟