如果一个输入停止,ffmpeg将停止流式传输


0

我正在尝试创建一个mpeg-ts流,其中视频是Xvfb的屏幕抓图,音频是来自互联网广播(mp3或aac流)的。它工作得相当好,但是如果互联网广播出现问题,则整个输出停止,而不仅仅是音频,并且直到我杀死ffmpeg并重新启动后才恢复。

这是我正在使用的命令行

DISPLAY=:1 ffmpeg -re -video_size 768x576 -framerate 50 -f x11grab -i :1 -i http://internet-radio/mp3 -c:v mpeg2video -b:v 6000k -minrate 6000k -maxrate 6000k -bufsize 3000k -dc 10 -top 0 -f mpegts -c:a mp2 -ac 2 -b:a 192k -flags +ilme+ildct -vf "tinterlace=interleave_top" udp://192.168.0.1:1234?pkt_size=1316

有什么方法可以防止它停止(只要在音频输入返回之前产生静音),或者至少检测到它已失败,以便我可以编写脚本来重新启动它?


根据我所做的相当广泛的研究,ffmpeg是一个同步过程,因此当您的输入之一停止时,它将停止读取另一输入。我的猜测是,您将必须编写某种缓冲程序来接收音频并将其中继到ffmpeg,然后该程序将自动检测何时停止输入音频,并将静音中继到ffmpeg
Russell Uhl

Answers:


0

尝试使用apad音频滤波器无限期地扩展流。您应该可以在现有字符串中添加-af命令...

-vf "[0]tinterlace=interleave_top" -af "[1]apad"

...或将您现有的-vf字符串更改为-filter_complex以处理音频和视频过滤命令...

-filter_complex "[0]tinterlace=interleave_top;[1]apad"

请注意,输入流说明符(x11grab为“ [0]”,音频流为“ [1]”)应该是可选的,但是如果未指定,则某些较旧的FFmpeg版本可能会使自己感到困惑。

如果这两个过滤器设置均不能按原样运行,则可能还需要在常规输出参数中添加-shortest标志(请注意,这不是过滤器字符串的一部分),例如:

-filter_complex "[0]tinterlace=interleave_top;[1]apad" -shortest
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.