Python:防止脚本在应用程序的 RTSP 失败时停止或挂起

问题描述 投票:0回答:0

我正在流式传输视频源 (RTSP) 并对其进行分析。该代码工作正常,但它只是在长时间的流式传输后挂起。我将 Wireshark 放在上面,发现在大多数情况下,服务器 (10.61.41.4) 正在发送 Keep-alive,客户端正在响应 ACK 但没有从服务器返回数据。客户端发送重置,因此发送重传。在这一点上,我猜流应用程序(服务器)刚刚停止,无论出于何种原因。我无法控制服务器。如果应用程序已经重新启动,脚本不知道,继续处于挂起状态。

我的问题是:当脚本挂起超过 30 秒时,我可以使用什么方法来检测脚本,然后重新启动整个脚本。我认为这是最简单的方法,而不是查看 TCP 流并在超过 4 时获取 TCP 重传。

我已经实现了 ffprobe.exe,认为它会返回一些东西来说明流是否存在,但是当流断开连接时它不会返回任何东西。我正在使用 ffprobe.exe,因为如果 opencv - cv2.VideoCapture() 上没有任何内容,它的超时会更快。然而,这似乎只在脚本启动时有效,而不是在刚刚描述的条件下。

我想当流停止时我没有在 cmnd 中使用正确的参数来获得结果,还是我应该使用其他方法?

def probe_stream(path, cam_name):
     
    cmnd = [r'C:\ffmpeg-2022\bin\ffprobe.exe', '-rtsp_transport', 'tcp', '-show_format', 
    '-pretty', '-loglevel', 'quiet', '-of', 'json', path]
    p = subprocess.Popen(cmnd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    print(p)
    print(p.communicate())
    s = p.communicate()[0]
    print(s)

    if p.returncode == 0:
        out, err = p.communicate()
        p.wait()
        probe_dct = json.loads(out)

        try:
            if probe_dct:
                return True
            elif err:
                print(err)
        except Exception as e:
            print(e)

谢谢

python rtsp ffprobe
© www.soinside.com 2019 - 2024. All rights reserved.