【问题标题】:FFMPEG RTMP STREAM RECORDING TIMEOUTFFMPEG RTMP 流录制超时
【发布时间】: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


    【解决方案1】:

    “-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
    

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

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

    【讨论】:

    • 这个溶胶有效。但请记住,5000000 太短了,因此您可能需要根据需要对其进行调整。
    • 花了两天时间寻找这个解决方案。如果您使用 API 并且 av_read_frame 函数被阻塞,这也有效。只需将选项放入创建 AVFormatContext 时传入的 AVDictionary 中即可。
    猜你喜欢
    • 1970-01-01
    • 2012-01-06
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 2019-03-20
    • 2021-12-29
    相关资源
    最近更新 更多