FFMPEG:RTSP 流冻结,但 FFMPEG 继续录制

Posted

技术标签:

【中文标题】FFMPEG:RTSP 流冻结,但 FFMPEG 继续录制【英文标题】:FFMPEG: RTSP stream freezes but FFMPEG keeps recording 【发布时间】:2019-12-01 01:18:34 【问题描述】:

编辑:在撰写本文时,FFMPEG 中没有可以检测/处理 RTP/RTSP 流何时仍处于活动状态但不再提供有效帧的功能。我能找到的唯一解决方案是通过停止录制来定期重置流,然后重新连接并开始 -f segment 不做的新录制。


我正在使用 FFMPEG 录制来自网络摄像机的 RTSP 流,一段时间后(通常大约一个半小时到两个小时)。我确定这是我正在使用的相机的具体问题,而不是 FFMPEG 或我的系统资源。

具体发生的是视频冻结,但摄像头的网络流量仍在继续 - 它似乎没有发送新帧。由于这种行为,FFMPEG 不会断开/继续录制,因为网络连接仍然存在。几分钟后,FFMPEG 输出中总会出现一个警告: More than 1000 frames duplicated 但它一直在录制——它只是一遍又一遍的同一帧。

我使用的命令是:

ffmpeg -stimeout 1000000 -rtsp_transport udp -fflags discardcorrupt -i rtsp://192.168.1.163/live/0/MAIN -vc libx265 -f segment -segment_time 300 -segment_atclocktime 1 -reset_timestamps 1 -strftime 1  "163-%Y-%m-%d_%H-%M-%S-h265.mp4"

一些注意事项:

超时似乎没有任何作用,因为网络连接保持不变,相机似乎只是停止发送(有效)帧。 将编解码器更改为复制并不能改善问题 更改 RTSP 传输不会改善问题 我知道有一个过滤器可以检测冻结帧,但我的 FFMPEG 似乎没有 - 我现在要尝试自己构建 FFMPEG;但更喜欢与捆绑的 FFMPEG 一起使用的解决方案 ~> 4.1.3

在复制超过 1000 帧后让 FFMPEG 失败并退出实际上是理想的,因为这样我就可以从脚本中生成 FFMPEG,监视进程,并在进程结束时重新启动它。不过,任何解决方案都会很棒。

【问题讨论】:

【参考方案1】:

这个人会帮助你:

11.134 mpdecimate

丢弃与前一帧相差不大的帧以降低帧速率。

此过滤器的主要用途是用于非常低比特率的编码(例如通过拨号调制解调器进行流式传输),但理论上它可以用于修复反向电视转换不正确的电影。

这样使用: "-vf", "mpdecimate,setpts=N/FRAME_RATE/TB",

【讨论】:

我应该更新我的问题,但我确实试过了。因为帧中没有真实数据,所以 mpdecimate 无法实际执行比较,并且过滤器永远不会运行 - 数据仍然被填满。问题不在于 ffmpeg 本身,我能找到的唯一解决方案是定期重置连接(停止并重新开始录制)。 ffmpeg 中没有我目前知道的功能/可以发现可以检测流何时未丢弃但不再传送帧的功能。

以上是关于FFMPEG:RTSP 流冻结,但 FFMPEG 继续录制的主要内容,如果未能解决你的问题,请参考以下文章

(原)关于获取ffmpeg解析rtsp流sdp中带有sps,pps的情况

FFmpeg 播放 RTSP/Webcam 流

ffmpeg搭建一个简单的rtsp推流方案

使用 ffmpeg 从 RTSP 流录制视频和音频数据

使用 FFMPEG 库接收 RTSP 流

ffmpeg实现rtsp流转hls流