如何终止正在读取 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()
我可以在发件人处写一个空帧来实现吗?或者任何其他方式让接收器自动终止?也许超时?
谢谢
解决方案:
RTP 或媒体不活动 Timers/Timeout
如果您没有从网络接收到任何数据,请创建一个计时器并在一段时间后终止呼叫。
RTCP BYE - 消息处理 (https://www.freesoft.org/CIE/RFC/1889/32.htm)
确保您的服务器支持 RTCP 协议。
如果有人看到这个,我之前没有想到一个简单的解决方案。通过查看 cv2 上限 (recv_cap),我仍然不知道流何时终止,但是无论如何我都在 Pi 和桌面之间使用 http 请求,一旦我收到来自 'finish' 的消息Pi,我只是在主线程中设置了一个 self.done = True(注意:接收器被 运行 作为一个单独的线程。),并在这种情况下退出循环。
我正在通过 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()
我可以在发件人处写一个空帧来实现吗?或者任何其他方式让接收器自动终止?也许超时?
谢谢
解决方案:
RTP 或媒体不活动 Timers/Timeout 如果您没有从网络接收到任何数据,请创建一个计时器并在一段时间后终止呼叫。
RTCP BYE - 消息处理 (https://www.freesoft.org/CIE/RFC/1889/32.htm) 确保您的服务器支持 RTCP 协议。
如果有人看到这个,我之前没有想到一个简单的解决方案。通过查看 cv2 上限 (recv_cap),我仍然不知道流何时终止,但是无论如何我都在 Pi 和桌面之间使用 http 请求,一旦我收到来自 'finish' 的消息Pi,我只是在主线程中设置了一个 self.done = True(注意:接收器被 运行 作为一个单独的线程。),并在这种情况下退出循环。