一、概述
本文分析 FFmpeg
af_volume
的实现。
二、af_volume 的作用及基本原理
af_volume 的作用是调整音频的音量。
基本原理是 PCM 数据乘于某个系数,就达到了调整音量的目的。
三、在调用 ffmpeg 程序时使用 af_volume
减半音量:
1 | ffmpeg -i input.mp3 -af "volume=0.5" output.mp3 |
ffmpeg 的表达式解析和计算支持将 “volume=0.5” 写作 “volume=1/2”(不会当成整数相除为0的情况) 或 “volume=-6.0206dB”(负数)。
音量增大50%:
1 | ffmpeg -i input.mp3 -af "volume=1.5" output.mp3 |
“volume=1.5” 可以写作 “volume=3.5218dB”(正数)。
-6.0206
是个什么数字?pow(10, -6.0206 / 20)
约等于0.5
。同样的对于3.5218
,pow(10, 3.5218 / 20)
约等于1.5
。
增加 8 分贝:
1 | ffmpeg -i input.mp3 -af "volume=8dB" output.mp3 |
如果带上 dB
后缀将直接增加或减少指定分贝。正数是增加,负数是减少。实际上传入 dB
值 FFmpeg 会转换成比例值。
四、源码分析
af_volume 源码位于 ffmpg/libavfilter/af_volume.c 中。
分析 filter 一般从 static int filter_frame(AVFilterLink *inlink, AVFrame *in)
函数入手。
如果音量参数是以 dB 为单位,在运算时会转换为比例。
五、C# 简单实现
1 | /// <summary> |