音频压缩
消除冗余信息 - 20HZ以下,2万HZ以上的数据人不敏感,属于无效 有损压缩
无损压缩
音频有损压缩
音频冗余信息
音频压缩技术是在保证信号在听觉方面不失真的前提下,对音频数据信号进行尽可能大的压缩。
压缩的主要方法是去除采集到的音频荣冗余信息。所谓冗余信息包括人耳听觉范围外20HZ~2万HZ的音频信号以及被掩盖掉的音频信号。
信号的遮蔽可以分为频域遮蔽和时域遮蔽
频域遮蔽效应即简单来说就是在频率相近的情况下,强度大的遮蔽强度小的,但是无法遮蔽频率不相近的,哪怕是强度明显大于其强度
时域遮蔽效应,即强度大的会遮蔽前后一定时间内其他小强度的声音。
音频无损压缩
熵编码-代指无损编码
哈夫曼编码->用很小的一串0和1的二进制数代替一个特别长的字符,用小的代替长的,频率越高的编码越小,频率越低的编码越长
算术编码->通过二进制的小数进行编码
香农编码->算术编码就是在香农编码的基础上改进而来的
时域转频域变换:将时域一块长时间的数据交给模块转换为频域,转换成多种频段的数据,便于拆出哪些是需要的数据,哪些是不需要的。
心理声学模型:去掉20HZ~2万HZ之外的,以及一些被遮蔽的声音
常见的音频编码器
常见的音频编码器包括OPUS、AAC、Ogg、Speex、iLBC、AMR、G.711等
OPUS:在线教育、音视频会议常用,延迟小压缩率高等优点,近些年比较突出。OPUS是较新的音编码器,WebRTC中默认使用。
AAC:目前应用最广泛的编解码器,用于IOS、安卓系统、嵌入式设备等都包含了硬件的AAC编解码,ffmpeg中也有很多的AAC编解码器。AAC在直播系统中应用广泛。
Ogg:收费,应用不是太广泛
Speex:在OPUS和AAC出现前使用广泛,有一个很好的优点,包括了回音消除的功能。
G.711:一般用于固话,窄带音频,编解码后的数据非常小,但是声音损耗严重
网上评测结果:OPUS > AAC > Ogg
纵轴是质量,横轴是码流大小
纵轴是延迟性,横轴是码率
AAC编码器介绍
AAC介绍
AAC(Advanced Audio Coding)由Fraunhofer IIS、杜比实验室、AT&T、Sony等公司共同研发,目的是取代MP3格式。
最开始是基于MPEG-2的音频编码技术,MPEG-4标准出现后,AAC重新集成了其特性,加入了SBR和PS技术。
目前常用的规格有AAC LC、AAC HE V1、AAC HE V2
图中蓝色的AAV HE V2 是误笔,实际上是AAC HE V2
AAC 规格描述
AAC LC:(Low Complexity)低复杂度规格,码流是128k,音质好。
AAC HE :等于AAC LC + SBR(Spectral Band Replication)。其核心思想是按频谱分开保存,低频编码保存主要成分,高频单独放大编码保存音质。码流在64k左右。
AAC HE V2:等于AAC LC + SBR + PS(Parametric Stereo)。其核心思想是双声道中的声音存在某种相似性,只需存储一个声道的全部信息,然后花很少的字节用参数描述另一个声道和她不同的地方。
AAC格式
ADIF(Audio Data Interchange Format)
这种格式的特征是可以确定的找到这个音频数据的开始,只能从头开始解码,不能在音频数据流中开始。这种格式常用在磁盘文件中。
相当于AAC数据加了一个头,解码AAC文件时先对头进行解析,拿到所有的参数信息,通过参数进行解码
ADTS(Transport Stream)
这种流的格式特征是每一帧都有一个同步字,所以可以在音频流的任何位置开始解码。它类似于数据流格式。
二者最本质的区别在于,ADIF只可以从头播放,如果播放前进行拖拽进度,或者中间进行拖拽进度,由于找不到头信息,会无法播放,但是ADTS因为每一帧都有同步字,所以拖拽后可以向后寻找头信息进行播放。
ADTS结构
Audio Object Types
1:AAC Main
2:AAC LC
…
5:SBR
…
29:PS
…
序号从1开始,真正编码中要减一
所以从数据中读出来数字1时要加一,即取2,也就是AAC LC,这是因为解析的数据是经过处理的,而在处理时做了减一操作,所以要在此进行复原。
Sampling Frequecy Index
这是一个在线解析ADTS头的网址,输入头进行解析。
在实际使用中ADTS这类的头在ffmpeg中有相应的API使用,也可以ffmpeg全线接管
通过ffmpeg命令生成AAC文件
如下命令:
ffmpeg -i xxx.mp4
-vn -c:a libfdk_aac
-ar 44100 -channels 2 -profile:a aac_he_v2 3.aac
参数:
-i-> 输入多媒体文件,一定要包含音频数据,因为要获取aac,并重新编码
-vn-> v代表vedio,n代表no,-vn过滤视频
-c->代表codec,即编码,a代表audio即使用音频编码器 指定音频编码器libfdk_aac,libfdk_aac是当前众多aac编解码器中性能最好的
-ar->代表代表音频采样率
-channels->代表双声道,即左右声道
-profile->对libfdk_aac编解码器设置一些参数,在profile中指定a即对音频的设置,设置为aac_he_v2,也可以直接设为aac_he_v1、aac
最后输出aac文件名xxx.aac
ffmpeg的音频编解码器参数参考网址:
http://ffmpeg.org/ffmpeg-codecs.html#libfdk_005faac