使用 FFMPeg 进行动态体积混合

Dynamic volume mixing with FFMPeg

我正在使用 FFMPeg 流式传输音频,需要使用 FFMpeg 混合两个音频源并动态设置音量级别。 IE。流开始后,我需要能够更新两个卷的比率。

目前,我使用 FFMPeg 的 CLI 版本进行音量混合和流式传输,但音量混合比是静态的。

有没有办法使用CLI工具动态设置音量比?也许是带有 FFMpeg 表达式的东西?

或者使用 API 是唯一的选择吗?如果是这样,谁能给我指出一个动态混合音频的例子?我还没找到。

编辑:这是我目前传递给混合音频的参数。同样,这工作正常,所以不包括日志,因为没有要修复的错误。问题是如何在进程启动后调整 amix 混合的比例。如果需要,愿意使用API。

                "-f rawvideo" + // container
                " -vcodec rawvideo" + // codec
                " -s " + width + "x" + height + // input video size, must be correct
                " -pix_fmt rgba" + // pixel format
                " -framerate " + frameRate +
                " -i pipe:0" + // from stdin in via pipe
               " -f dshow" +
                " -i audio=\"Stereo Mix (Realtek(R) Audio)\"" + //
                " -f dshow" +
                " -i audio=\"Microphone Array (Xbox NUI Sensor)\"" + // 
                " -filter_complex \"amix\"" +  // mix the two inputs, can added ratio if needed
                " -c:v libx264" + // x264 software encoder
                " -g " + frameRate *2 +
                " -keyint_min " + frameRate +
                " -c:a aac" + // audio format
                " -b:v 6M -maxrate 2M -bufsize 1M" + // constrain bitrate per twitch
                " -f flv" +
                " " + address 
            );

命令

  • 一些过滤器支持命令,允许对一些过滤器选项进行临时控制。并非所有过滤器都有命令。有时会添加命令,因此请始终使用最近的 ffmpeg 来利用新功能。
  • 参考 ffmpeg -filters 并在过滤器名称旁边查找 C,或查看 man ffmpeg-filtersFFmpeg Filters documentation 并搜索 commands 在每个过滤器下。
  • 并非所有选项都有等效的命令。

(a)sendcmd 和 (a)zmq

  • asendcmd / sendcmd - 通过交互模式执行计划命令或交互命令。
  • azmq / zmq - 执行交互式、按需、实时命令。要启用 (a)zmq,您需要安装 libzmq 库和 headers 并使用 --enable-libzmq.
  • 配置 ffmpeg

asendcmd 示例

在时间戳 10 处将音量减半:

ffmpeg -i input -filter_complex "asendcmd=c='10.0 volume volume 0.5',volume" output

如果您想进行很多调整,那么在单独的文本文件中进行管理并使用 f 选项会更容易。参见 (a)sendcmd documentation. See more examples

交互模式

你可以使用c(发送命令到第一个支持它的匹配过滤器)或C(Send/Queue命令到所有匹配过滤器)在编码期间发送命令。在编码时使用 ? 了解更多信息,请参阅 example, and refer to (a)sendcmd documentation 了解语法。


azmq 示例

运行ffmpeg,然后在你想调节音量的时候执行zmqsend

ffmpeg -i input -filter_complex "volume@foo,azmq" output
echo "volume@foo volume 0.5" | tools/zmqsend

zmqsend 在 FFmpeg 源的 tools 目录中可用(安装 zmq,./configure --enable-libzmq && make -j && make tools/zmqsend)。如果您在 Windows 上,只需下载 Gyan's FFmpeg builds 之一并获取工具包。