我有一个需要通过RTSP流式传输的视频。该流将由带有OpenCV的python脚本处理。 所以,我需要在Python中逐帧读取此流。
我在Windows 10,Opencv 3.4,Python 3.6.3上。防火墙已禁用。
如果我将使用opencv打开任何RTSP流,那没有问题:opencv可以处理来自IP摄像机的标准rtsp流。
BUT,如果我通过RTSP从VLC流式传输视频并尝试使用python-opencv打开它,则会引发错误,可能取决于ffmpeg:
Python代码:
import cv2
vidcap = cv2.VideoCapture("rtsp://127.0.0.1:8554/video")
while True:
success,image = vidcap.read()
错误:
[rtsp @ 00000234956b24a0] method SETUP failed: 461 Client error
warning: Error opening file (/build/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:808)
warning: rtsp://127.0.0.1:8554/video (/build/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:809)
我该如何处理?这是opencv上的典型错误,但是也许可以使用一种解决方法。显然,流视频是正确的(我用另一个VLC实例将其打开)
我尝试了几件事,OpenCV似乎不支持RTSP上的VLC流,而且我没有找到其他解决方案。
通过设置以下环境变量,我能够使用Python中的OpenCV 4.0.0(使用FFMPEG构建)解决打开RTSP流的问题:
import os
os.environ["OPENCV_FFMPEG_CAPTURE_OPTIONS"] = "rtsp_transport;udp"
FFMPEG默认为TCP传输,但是某些RTSP提要是UDP,因此这为FFMPEG设置了正确的模式。
然后使用:
cv2.VideoCapture(<stream URI>, cv2.CAP_FFMPEG)
ret, frame = cap.read()
while ret:
cv2.imshow('frame', frame)
# do other processing on frame...
ret, frame = cap.read()
if (cv2.waitKey(1) & 0xFF == ord('q')):
break
cap.release()
cv2.destroyAllWindows()
照常。