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

Video 从udp流式传输时,轻轻停止ffmpeg(使其完成mp4文件的写入),video,ffmpeg,udp,video-streaming,Video,Ffmpeg,Udp,Video Streaming,我试图在服务器上接收udp流并将其写入mp4文件。这很好: ffmpeg -i udp://127.0.0.1:12345 -codec copy out.mp4 如果我按CTRL+C(或将SIGINT发送到进程),ffmpeg将退出,并且我有一个工作的mp4文件 但是,如果数据停止进入udp端口(例如,在流媒体播放10分钟后),我尝试停止ffmpeg,则需要2个中断信号,此时ffmpeg突然退出,并导致无法播放mp4文件 有人知道如何防止ffmpeg在没有输入数据时挂起,或者强制它写出m

我试图在服务器上接收udp流并将其写入mp4文件。这很好:

  ffmpeg -i udp://127.0.0.1:12345 -codec copy out.mp4
如果我按CTRL+C(或将SIGINT发送到进程),ffmpeg将退出,并且我有一个工作的mp4文件

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

有人知道如何防止ffmpeg在没有输入数据时挂起,或者强制它写出mp4头吗

我知道我可以指定url选项

 udp://127.0.0.1:12345?timeout=<microseconds>
udp://127.0.0.1:12345?timeout=
但是,我需要能够在录制过程中忽略偶尔(5-10分钟长)的暂停,只在结束时退出。
因此,即使我将超时设置为60000000,当我想停止流时(例如,如果没有数据),我的应用程序也会等待10分钟,并且当我向它发送信号时,我需要它立即退出。找到了一个解决方法:如果没有数据输入,将图像(例如,绿色屏幕)作为视频转发到所需的端口。e、 g

ffmpeg -loop 1 -y -re -i greenscreen.jpg -r 30 -vcodec libx264 -an -f h264 udp://127.0.0.1:12345
这样,ffmpeg写入mp4文件的过程将优雅地停止,但最后可能会出现1-2秒的绿色屏幕视频


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

将SIGINT发送到ffmpeg进程会通过正确保存头文件轻轻杀死它。
至少对于2.5.7之后的版本,您可以添加movflags,即使强制停止ffmpeg,您仍然可以播放mp4文件。
ffmpeg-i输入-movflags+frag\u关键帧+separate\u moof+omit\u tfhd\u offset+empty\u moov输出

更多详情(吉安的回答):

其他建议:
添加诸如
-重新连接\u streamed 1
之类的标志,如果出现错误,ffmpeg将尝试重新连接。

文档:

如果没有数据输入,SIGINT(即使是2.5.7之后的版本)会创建一个损坏的mp4,因此我建议在2021年使用一个变通方法,并且这种行为仍然可以观察到,从而导致corupted.mp4
ffmpeg版本3.4.6 Linux
唯一的解决方案仍然是保存块和合并,这意味着额外的处理。当然,也可以在使用相同设置时保存到
.mkv
。这应该马上就能奏效。