如何终止正在读取 gstreamer 流的 cv2.VideoCapture?

How to terminate a cv2.VideoCapture that is reading a gstreamer stream?

我正在通过 gstreamer 管道从 Raspberry Pi 流式传输视频。我使用 OpenCV 和 gstreamer 在桌面上阅读了这个流。一切都很好,除了接收器不知道流何时结束。

接收者代码与

中基本相同

我的问题是,如果我不通过键入 'q' 退出接收方,cap_receive.read() 似乎永远不会 return False 作为发送方完成后的 retval。

gst_str_simple = "udpsrc port=5000 ! application/x-rtp,encoding-name=H264,payload=96 ! rtph264depay ! avdec_h264 ! videoconvert ! appsink"

recv_cap = cv2.VideoCapture(gst_str_simple, cv2.CAP_GSTREAMER)

if not recv_cap.isOpened():
    print('VideoCapture not opened')
    exit(0)

while True:
    ret, frame = recv_cap.read()

    if not ret:
        print('empty frame')
        break

    cv2.imshow('receive', frame)
    if cv2.waitKey(1)&0xFF == ord('q'):
        break

recv_cap.release()

我可以在发件人处写一个空帧来实现吗?或者任何其他方式让接收器自动终止?也许超时?

谢谢

解决方案:

  1. RTP 或媒体不活动 Timers/Timeout 如果您没有从网络接收到任何数据,请创建一个计时器并在一段时间后终止呼叫。

  2. RTCP BYE - 消息处理 (https://www.freesoft.org/CIE/RFC/1889/32.htm) 确保您的服务器支持 RTCP 协议。

如果有人看到这个,我之前没有想到一个简单的解决方案。通过查看 cv2 上限 (recv_cap),我仍然不知道流何时终止,但是无论如何我都在 Pi 和桌面之间使用 http 请求,一旦我收到来自 'finish' 的消息Pi,我只是在主线程中设置了一个 self.done = True(注意:接收器被 运行 作为一个单独的线程。),并在这种情况下退出循环。