我正尝试在服务器上接收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文件。
有人知道如何在没有输入数据的情况下防止mp4挂起,或者强制它写出FMPEG头吗?
我知道我可以指定url选项。
udp://127.0.0.1:12345?timeout=<microseconds>但是,我需要能够忽略录制过程中偶尔(5-10分钟长)的停顿,并且只在录制结束时退出。因此,即使我设置了timeout=60000000,它也会导致我的应用程序在我想要停止流时等待10分钟(例如,如果没有数据),并且当我向它发送一个SIGINT时,我需要它立即退出
发布于 2020-11-28 06:54:12
你可以添加movflag,即使你强制停止了ffmpeg,你仍然可以播放mp4文件。
ffmpeg -i input -movflags +frag_keyframe+separate_moof+omit_tfhd_offset+empty_moov output
更多细节在这里(Gyan的回答):
https://video.stackexchange.com/a/18179/33701
其他建议:
添加像-reconnect_streamed 1这样的标志,如果出现错误,ffmpeg将尝试重新连接。
发布于 2014-10-16 02:55:56
找到了一个解决方法:如果没有数据传入,则将图像(例如绿屏)作为视频转发到所需的端口。例如:
ffmpeg -loop 1 -y -re -i greenscreen.jpg -r 30 -vcodec libx264 -an -f h264 udp://127.0.0.1:12345这样,编写mp4文件的ffmpeg将优雅地停止,但您可能会在结束时获得1-2秒的绿屏视频。
问题是,我不确定如何自动检测“无数据”
发布于 2015-07-23 01:37:33
将SIGINT发送到ffmpeg进程会通过正确保存报头来轻轻地杀死它。至少对于2.5.7之后的版本
https://stackoverflow.com/questions/23020834
复制相似问题