FFMPEG RTMP流录制超时

abr*_*ski 4 ffmpeg rtmp video-streaming video-recording

[已解决] - 最终编辑中的解决方案我正在使用 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)
Run Code Online (Sandbox Code Playgroud)

我尝试在输入之前和之后添加 -timeout 0 选项,如下所示

$command = "ffmpeg -timeout 0 -i {$rtmpUrl} -c:v copy -c:a copy -t 3600 {$path} >/dev/null  2>/dev/null &"; 
Run Code Online (Sandbox Code Playgroud)

$command = "ffmpeg -i {$rtmpUrl} -c:v copy -c:a copy -timeout 0 -t 3600 {$path} >/dev/null  2>/dev/null &";
Run Code Online (Sandbox Code Playgroud)

但没有任何改善。

我在这里缺少什么?当新数据停止从直播中产生时,有什么方法可以自动停止脚本(意味着流停止并且录制也应该停止)。

注意 $rtmpUrl 和 $path 已被检查,只要脚本在直播结束前停止,一切都会正常。

任何建议都将受到高度赞赏

后来编辑:意识到超时设置在错误的位置,首先添加它,但结果仍然相同,所以仍在寻找任何建议

$command = "timout 0 ffmpeg -i {$rtmpUrl} -c:v copy -c:a copy -t 3600 {$path} >/dev/null  2>/dev/null &";
Run Code Online (Sandbox Code Playgroud)

最终编辑,以防有人发现此线程在类似情况下寻找解决方案,已解决,超时不是我想要的,而是使用标志-re为我们修复了它。现在,当不再有新帧进入时,脚本将停止

$command = "ffmpeg -re -i {$rtmpUrl} -c:v copy -c:a copy -t 3600 {$path} >/dev/null  2>/dev/null &";
Run Code Online (Sandbox Code Playgroud)

Ale*_*xey 6

“-re”标志对我没有帮助,但我发现其他标志“-rw_timeout 5000000”(以微秒为单位),所以命令

ffmpeg -rw_timeout 5000000  -i rtmp://localhost:1935/video/$1 -c:v copy -c:a copy /var/www/rec/$1.mp4 2>> /var/www/log/ffmpeg.log
Run Code Online (Sandbox Code Playgroud)

空闲 5 秒后退出,我得到了好的文件。

该命令从外部 sh 文件执行,该文件从 /etc/nginx/sites-available/mysite exec_push 命令调用,因此 nginx-rtmp 不会杀死 ffmpeg。