fmpeg音频编码组件aac(Advanced Audio Coding (AAC) encoder)学习

byte=1kb,所以128千比特的数据量是:128*1000/8/1024=156.25kb,也就是使用128kbps采集一秒钟的生意数据就产生156.25kb数据。这个128kbps是怎么算出来的,它是由:采样率*采样深度*声道数量。采样率:一秒钟采集声音样本的次数比如4400hz,表示1秒钟采集44000次声音数据,也就是生成44000个bit单位的数据;采样深度:每次采样的样本所保存的声音特点数据,比如采样深度:10,表示一次采样,保留10bit的声音特点数据;声道:同一时间,采集声音来源的通道个数,比如2声道,就是同一时间是录入两个不同的声音样本。那最终比特率就是:4400*10*2=880,00bit/s 就是88kbps。

-q 设置动态码率的质量

  例如:ffmpeg -i input.wav -c:a aac -q:a 2 output.m4a #-q:a <数值>:设定质量等级。数值范围通常为 0.1 到 10(取决于编码器实现),数值越低,音质越好,文件越大;数值越高,压缩率越高,文件越小。

-cutoff 设置声音频率的上限。超过这个上限的声音就会被舍弃。

  声音的频率是说,一秒钟声音在传播介质通常就是空气中震荡的次数,比如声音频率:1000hz,表示1秒钟声音在空气中震荡1000次。频率越低声音越沉。人耳的听觉范围是: 20 Hz ~ 20,000 Hz的声音。使用例子比如:

  # 保留约 20kHz 以下的所有频率,人耳听不到的高频声音就舍弃了

  ffmpeg -i music.wav -c:a libfdk_aac -b:a 256k -cutoff 20000 music.m4a

-aac_coder 设置编码时使用的编码算法

  它有三个算法:1.'twoloop' 它会先遍历一遍声音数据,来寻找一个优化值,然后第二次循环使用这个优化值,来处理声音,可以达到降噪的目的。2.'fast',是twoloop的简化版,它是直接给出一个优化值,不会根据具体的声音数据去找这个优化值,它在64kbps的比特率下,效果不好,但是在192kbps的比特率下效果跟twoloop的效果相近。它因为少了寻找优化值的步骤,所以编码速度要比twoloop快,在直播,监控时,可以指定这个参数,达到提高编码效率的目的,减少延迟。3、'anmr'。

-aac_ms 转换立体声

  它的全称为 Mid/Side Stereo Coding(中/侧立体声编码),默认值auto:自动根据条件启动或不启动,enable​:强制启用。disable:完全禁用。它开启后可以减少编码后的数据大小可以把左声道,右声道两个声道的数据,转换为中立声音(Mid)和侧独立声音数据(Side)。Mid的算法是(左声道数据+右声道数据)/2;Side的计算是:(左声道数据-右声道数据)/2。虽然还是会用两个通道,但因为左右声道的中低频声音数据相近,那么Side的数据,两边一减很多都是接近或等于0,然后编码器就可以压缩这些接近或等于0的数据,用更少的编码来表示Side的数据,就可以达到了减少数据量的目的。例子:

  # 使用默认的自动模式(推荐)

  ffmpeg -i input.wav -c:a aac -aac_ms auto output.m4a

  # 设置aac编码,以48kbps编码,一秒钟声音的数据量是48*1000bit,强制开启 M/S 以在低码率下保立体声,

  ffmpeg -i input.wav -c:a aac -b:a 48k -aac_ms enable output.m4a

-aac_is

  丢弃立体声模拟声源所在物理位置的信息,这个位置信息并不是真实的物理位置,而是通过一些算法模拟的位置信息,比如模拟出人左耳听到的声音效果,就是左声道。那它本来可以听出声音可能出现在左耳的感觉,但使用了这个之后,就区分不了感觉是左耳听到的还是右耳听到的了。这样达到大大的减少编码后的数据量的作用。使用例子:

  # 使用默认的自动模式(推荐)

  ffmpeg -i input.wav -c:a aac -aac_is auto output.m4a

  # 强制开启(仅在"只要能出声就行"的低码率场景使用)

  ffmpeg -i input.wav -c:a aac -b:a 32k -aac_is enable output.m4a

-aac_pns

  它是FFmpeg 中 AAC 编码器的感知噪声替换(Perceptual Noise Substitution)开关。它针对的是人耳听不到的高频声音,它在

编码时,把这个高频声音打个标记,并去掉这个被标记的数据段原始的数据,但又要符合编码规则,它用AAC编码规则支持的指令去替代这段被删除的数据,然后直接保存到输出文件里。在使用能播放AAC编码的音频软件时播放这个输出文件时,在其播放过程,就会读取到这些标记,并合成原来被舍去的高频声音的数据。例子:

  ffmpeg -i input.wav -c:a aac -aac_pns 1 output.m4a

  # 默认开启 PNS(无需显式指定)

  ffmpeg -i input.wav -c:a aac output.m4a

  # 显式禁用 PNS(通常仅用于调试)

  ffmpeg -i input.wav -c:a aac -aac_pns 0 output.m4a

-aac_tns

  它的作用是将噪声从"无声或弱声"的时间段,"挤"到声音大的爆发的时间段,人耳听到声响大的声音就听不到那些声音小的噪声了。它的原理是把声音的数据根据20ms时间分成一段段的,在每一段数据,如果发现这段数据前半段是"沙沙"的小的噪音,后半段是很大的声音数据,这个时候这个参数,就会把前半段的噪声数据推到后半段。这个噪音数据还是存在是会播放的,只不过就被大的声音覆盖掉了,人耳就听不清噪音了,只能听到大的声音。如果这个片段里没有声音大,声音都很小,效果就不好,默认是自动模式,根据声音特点来自动决定按这个原理编码那些数据段。例子:

  # 默认开启 TNS(标准用法)

  ffmpeg -i input.wav -c:a aac output.m4a

  # 显式关闭 TNS(通常不建议)

  ffmpeg -i input.wav -c:a aac -aac_tns 0 output.m4a

-aac_ltp

  它的作用是,在全段的每个20ms音频数据里,用指令来替代这所有片段中有相似声音波形的数据。在解码时,就像aac_pns 一样的方法去解码。只不过解码的指令有区别。

-profile

  它的作用是限制使用那些优化编码的参数,比如-aac_pns 、-aac_tns、-aac_ltp。它有三个可选参数:1.''aac_low',指定了这个就可以使用:TNS + PNS,但就不能使用-aac_ltp编码工具。2.'aac_ltp',允许使用aac_ltp编码工具。3.'mpeg2_aac_low'。例子:

ffmpeg -i input.wav -c:a aac -profile:a aac_low -b:a 128k output.m4a

相关推荐
0566464 小时前
Python康复训练——常用标准库
开发语言·python·学习
weixin_495248404 小时前
短剧视频翻译配音指南:古装、甜宠与悬疑如何本地化?
音视频
0566465 小时前
Python康复训练——控制流与函数
开发语言·python·学习
禹亮科技5 小时前
制造业100㎡跨国技术评审会议室音视频整体解决方案(亿联+思必驰+讯飞AI落地实践)
人工智能·音视频·视频会议系统集成
潜创微科技6 小时前
HDMI 分配器芯片方案商 IT66630 有源分配芯片方案
音视频
不爱记笔记7 小时前
多模态AI如何理解视频内容?从视觉、语音到语义的三层技术拆解
人工智能·自然语言处理·nlp·音视频·多模态
早睡早起身体好1237 小时前
为什么 Network 中会出现两个同名请求?——CORS 预检请求学习笔记
网络·笔记·学习·网络安全
菩提树下的打坐7 小时前
测试左移的更深一层:用 DDD 战术设计反推测试边界
学习
casual~8 小时前
模逆元计算方法详解:扩展欧几里得算法与费马小定理
学习·算法·逆元
@Mike@8 小时前
06-数据库学习笔记(存储模型与数据压缩)
数据库·笔记·学习