在不中断 rtmp 流的情况下更新 ffmpeg 过滤器
Posted
技术标签:
【中文标题】在不中断 rtmp 流的情况下更新 ffmpeg 过滤器【英文标题】:update ffmpeg filter without interrupting rtmp stream 【发布时间】:2021-09-17 08:25:04 【问题描述】:我正在使用 ffmpeg 读取 rtmp 流,添加模糊框等过滤器并创建不同的 rtmp 流。
例如,命令如下所示:
ffmpeg -i <rtmp_source_url> -filter_complex "split=2[a][b];[a]crop=w=300:h=300:x=0:y=0[c];[c]boxblur=luma_radius=10:luma_power=1[blur];[b][blur]overlay=x=0:y=0[output]" -map [output] -acodec aac -vcodec libx264 -tune zerolatency -f flv <rtmp_output_url>
其中 rtmp_source_url 是相机/无人机发送通量的位置,而 rtmp_output_url 是带有模糊框的结果视频。
模糊框需要移动,因为目标移动或相机移动了。 我想在不中断输出流的情况下这样做。
我正在使用 fluent-ffmpeg 创建 ffmpeg 进程,而程序的不同部分计算模糊框的位置。
感谢您的帮助和时间!
【问题讨论】:
某些过滤器的参数可以在运行时更改:ffmpeg.org/… 例如:裁剪过滤器,但不能覆盖过滤器。 【参考方案1】:考虑使用管道来拆分处理。 看这里 - https://ffmpeg.org/ffmpeg-protocols.html#pipe
The accepted syntax is:
pipe:[number]
number is the number corresponding to the file descriptor of the pipe (e.g. 0 for stdin, 1 for stdout, 2 for stderr). If number is not specified, by default the stdout file descriptor will be used for writing, stdin for reading.
For example to read from stdin with ffmpeg:
cat test.wav | ffmpeg -i pipe:0
# ...this is the same as...
cat test.wav | ffmpeg -i pipe:
For writing to stdout with ffmpeg:
ffmpeg -i test.wav -f avi pipe:1 | cat > test.avi
# ...this is the same as...
ffmpeg -i test.wav -f avi pipe: | cat > test.avi
例如,您读取一个 rtmp 流,添加一个过滤器(如模糊框)并创建一个不同的 rtmp 流。所以,第一步是分离传入和传出流-
ffmpeg -i <rtmp_source_url> -s 1920x1080 -f rawvideo pipe: | ffmpeg -s 1920x1080 -f rawvideo -y -i pipe: -filter_complex "split=2[a][b];[a]crop=w=300:h=300:x=0:y=0[c];[c]boxblur=luma_radius=10:luma_power=1[blur];[b][blur]overlay=x=0:y=0[output]"
-map [output] -acodec aac -vcodec libx264 -tune zerolatency -f flv <rtmp_output_url>
我不知道你有什么标准来改变模糊框,但现在你可以在第二个 ffmpeg 中处理传入的帧。另外,我使用1920x1080
作为视频大小 - 您可以将其替换为实际大小。
对于第一次迭代,不要担心音频,做你的模糊操作。因为我们正在喂 rawvideo
- 在这个例子中,音频将被忽略。
【讨论】:
您好,感谢您花时间在 ffmpeg 中向我展示此选项。但我看不到如何更新模糊框定义。或者可以在不中断最终输出流的情况下更改其中的一部分?或者你的意思是我应该通过不同的工具(或制作一个)作为管道的一部分?模糊框基本不用ffmpeg。 不知道模糊框依赖什么。听起来您需要进行一些自定义处理。在这种情况下,使用 libav 构建一个程序来访问 ffmpeg API。此自定义过滤器将成为您管道的第二阶段。以上是关于在不中断 rtmp 流的情况下更新 ffmpeg 过滤器的主要内容,如果未能解决你的问题,请参考以下文章