当多个循环输入缓冲区中的任何一个溢出时如何使 ffmpeg 失败
How to make ffmpeg fail when any of multiple circular input buffers overruns
我使用如下方式将两个多播重新复用为一个:
ffmpeg -i udp://239.1.1.1:5000 -i udp://239.1.1.2:5000 -map 0:v -map 0:a -map 1:a -codec copy -f mpegts udp://239.1.1.3:5000
如果其中一个多播消失,另一个很快就会超出其循环缓冲区,导致该输入线程按预期退出。
不幸的是,由于没有输入,另一个循环缓冲区没有溢出,所以 ffmpeg 挂起,什么都不做。
是否可以将 ffmpeg 配置为如果 任何 输入线程退出,ffmpeg 将停止?
提前致谢!
答案是在选项中添加-xerror
以强制ffmpeg在错误时停止并退出。
这可以与相关输入的 -timeout
值结合使用,在这种情况下,ffmpeg 将在该时间段内没有数据到达时立即退出。
或者,可以使用循环缓冲区溢出来触发错误,但是ffmpeg直到next从输入缓冲区读取到线程消息队列时才会真正失败,这需要失败的多播返回,因为线程消息队列将被阻塞(取决于指定的 fifo_size
和 thread_queue_size
选项)。
我使用如下方式将两个多播重新复用为一个:
ffmpeg -i udp://239.1.1.1:5000 -i udp://239.1.1.2:5000 -map 0:v -map 0:a -map 1:a -codec copy -f mpegts udp://239.1.1.3:5000
如果其中一个多播消失,另一个很快就会超出其循环缓冲区,导致该输入线程按预期退出。
不幸的是,由于没有输入,另一个循环缓冲区没有溢出,所以 ffmpeg 挂起,什么都不做。
是否可以将 ffmpeg 配置为如果 任何 输入线程退出,ffmpeg 将停止?
提前致谢!
答案是在选项中添加-xerror
以强制ffmpeg在错误时停止并退出。
这可以与相关输入的 -timeout
值结合使用,在这种情况下,ffmpeg 将在该时间段内没有数据到达时立即退出。
或者,可以使用循环缓冲区溢出来触发错误,但是ffmpeg直到next从输入缓冲区读取到线程消息队列时才会真正失败,这需要失败的多播返回,因为线程消息队列将被阻塞(取决于指定的 fifo_size
和 thread_queue_size
选项)。