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

时间:2019-08-22 15:23:33

标签: opencv gstreamer

我正在通过gstreamer管道流式传输来自Raspberry Pi的视频。我使用OpenCV和gstreamer在桌面上阅读了此流。一切正常,除了接收方不知道流何时完成。

接收方代码与convert gstreamer pipeline to opencv in python

中的代码基本相同

我的问题是,如果我不通过键入'q'退出接收者,那么cap_receive.read()似乎永远不会在发送者完成后返回False作为其返回值。

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()

我可以在发件人处写一个空框架来实现此目的吗?还是通过其他方法使接收器自动终止?可能会超时吗?

谢谢

2 个答案:

答案 0 :(得分:0)

解决方案:

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

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

答案 1 :(得分:0)

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