我正在流式传输视频源 (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)
谢谢