一、概述
本文分析 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> |