如何逐帧处理Python上的RTSP流?

问题描述 投票:2回答:1

我有一个需要通过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 rtsp
1个回答
0
投票

通过设置以下环境变量,我能够使用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()

照常。

© www.soinside.com 2019 - 2024. All rights reserved.