【问题标题】:Dynamic volume mixing with FFMPeg使用 FFMPeg 进行动态音量混合
【发布时间】:2021-06-01 23:46:44
【问题描述】:

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

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

有没有办法使用 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 
            );

【问题讨论】:

  • 显示你的命令和日志。
  • 音量过滤器支持命令。
  • 我现有的 cli 调用使用音量可以正常工作,但它没有根据动态比率混合音频。例如,在直播的第 2 分钟,我不会将麦克风的值更改为更大声,这是我想要做的。
  • @gyan 你能告诉我一个使用命令影响 ffmpeg 一旦运行的例子吗?我找到了这个文档,但没有例子:ffmpeg.org/…
  • 我也很想为此找到解决方案。我不相信有一种方法可以动态调整输入的相对音量一旦创建了过滤器。鉴于以下ffmpeg -i speech.mp4 -i backgroundmusic.mp4 -filter_complex "[0:a]volume=0.9[a1];[1:a]volume=0.1[a2];[a1][a2]amix[aout]" -vn -dn -map [aout] -c:a aac mixed.mp4,我如何实时改变音量?我也不相信使用 API 可以做到这一点,因为我认为过滤器在创建后是静态的,但我希望得到更正。我认为这可以用 gstreamer 完成,但我总是更喜欢 ffmpeg!

标签: ffmpeg


【解决方案1】:

命令

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

(a)sendcmd 和 (a)zmq

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

asendcmd 示例

在时间戳 10 处减半:

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

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

交互模式

您可以在编码期间使用 c(将命令发送到支持它的第一个匹配过滤器)或 C(发送/队列命令到所有匹配的过滤器)发送命令.编码时使用 ? 了解更多信息,请参阅example,语法请参阅(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 之一并获取工具包。

【讨论】:

  • 谢谢你这么棒的回答。我还没有尝试过,但它填补了我标记为已接受答案的文档空白。
  • 对这个位置的其他人的小修正,正确的音量命令是echo 'volume@foo volume 0.5' | tools/zmqsend
  • @jvhang 是的,echo 肯定需要引用,因为有空格。我记得在我的测​​试中引用了它,但我忘记在我的答案中做同样的事情。已更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
  • 2012-11-19
  • 2013-05-22
  • 2016-02-05
  • 2020-08-26
  • 1970-01-01
相关资源
最近更新 更多