【发布时间】:2020-11-16 11:56:40
【问题描述】:
[已解决] -- 最终编辑中的解决方案 我正在使用 ffmpeg 录制 rtmp 直播,并希望添加一个标志,该标志将在新数据停止到达时自动停止处理。
如果我启动和停止脚本(通过按需终止进程来停止),一切都很好,记录被保存并且可以播放。 但是,当流在没有手动调用 STOP 的情况下从源停止时,脚本仍将运行一段时间,并且生成的文件将被损坏(通过手动停止调用进行测试,并在录制前停止流,模拟浏览器/标签关闭或断开连接 - 失败)
我正在运行的命令
$command = "ffmpeg -i {$rtmpUrl} -c:v copy -c:a copy -t 3600 {$path} >/dev/null 2>/dev/null &";
$res = shell_exec($command)
我尝试在这样的输入之前和之后添加 -timeout 0 选项
$command = "ffmpeg -timeout 0 -i {$rtmpUrl} -c:v copy -c:a copy -t 3600 {$path} >/dev/null 2>/dev/null &";
和
$command = "ffmpeg -i {$rtmpUrl} -c:v copy -c:a copy -timeout 0 -t 3600 {$path} >/dev/null 2>/dev/null &";
但没有改善。
我在这里缺少什么?当新数据停止来自直播时,有什么方法可以自动停止脚本(这意味着流停止并且录制也应该停止)。
注意 $rtmpUrl 和 $path 已检查,只要脚本在直播结束前停止,一切正常。
非常感谢任何建议
稍后编辑:意识到超时设置在错误的位置,先添加它但结果仍然相同,所以仍在寻找任何建议
$command = "timout 0 ffmpeg -i {$rtmpUrl} -c:v copy -c:a copy -t 3600 {$path} >/dev/null 2>/dev/null &";
最终编辑
万一有人发现这个线程在类似情况下寻找解决方案,
解决了,超时不是我想要的,而是使用-re 标志为我们修复了它。
现在,当没有更多新帧进入时脚本会停止
$command = "ffmpeg -re -i {$rtmpUrl} -c:v copy -c:a copy -t 3600 {$path} >/dev/null 2>/dev/null &";
【问题讨论】:
标签: ffmpeg video-streaming rtmp video-recording