从 udp 流式传输时,轻轻停止 ffmpeg(以使其完成写入 mp4 文件)

ier*_*dna 7 video udp ffmpeg video-streaming

我正在尝试在服务器上接收 udp 流并将其写入 mp4 文件。这工作正常:

  ffmpeg -i udp://127.0.0.1:12345 -codec copy out.mp4
Run Code Online (Sandbox Code Playgroud)

如果我按 CTRL+C(或将 SIGINT 发送到进程),ffmpeg 将退出并且我有一个可用的 mp4 文件。

但是,如果数据停止进入 udp 端口​​(例如,在 10 分钟的流传输后)并且我尝试停止 ffmpeg,则它需要 2 个中断信号,此时 ffmpeg 会突然退出并导致无法播放的 mp4 文件。

有谁知道如何防止 ffmpeg 在没有输入数据时挂起或强制它写出 mp4 标头?

我知道我可以指定一个 url 选项

 udp://127.0.0.1:12345?timeout=<microseconds>
Run Code Online (Sandbox Code Playgroud)

但是,我需要能够在录制过程中忽略偶尔(5-10 分钟长)的暂停,并且只在最后退出。所以即使我设置 timeout=60000000 它会导致我的应用程序在我想停止流时等待 10 分钟(例如,如果没有数据)并且当我向它发送 SIGINT 时我需要它立即退出

ier*_*dna -1

找到了解决方法:如果没有数据传入,则将图像(例如绿屏)作为视频转发到所需的端口。例如

ffmpeg -loop 1 -y -re -i greenscreen.jpg -r 30 -vcodec libx264 -an -f h264 udp://127.0.0.1:12345
Run Code Online (Sandbox Code Playgroud)

这样,ffmpeg 写入 mp4 文件就会正常停止,但最后您可能会看到 1-2 秒的绿屏视频。

问题是,我不确定如何自动检测“无数据”