I\'m on windows 10 using python 3.6.4, installed opencv (3.4) through pip. Here\'s the code I\'m using:
import numpy as np
import cv2
cap = cv2.VideoCapture(
As mentionned, I tried to put in the python code the following:
import os
os.environ["OPENCV_FFMPEG_CAPTURE_OPTIONS"] = "rtsp_transport;0"
or
import os
os.environ["OPENCV_FFMPEG_CAPTURE_OPTIONS"] = "rtsp_transport;udp"
or
import os
os.environ["OPENCV_FFMPEG_CAPTURE_OPTIONS"] = "dummy"
unfortunately none was working as I was still running my program in the same cmd window.
I simply opened a new cmd window and gave a try for a new run... and it works (with "rtsp_transport;0" :)
OpenCV defaults to using TCP for RTP transport, and it seems that your device does not support that (as can be seen with FFmpeg). OpenCV stie actually has a question on the same topic. Here is the github issue that mentions switching to TCP. There does not seem to be a way to force UDP in OpenCV. So you have two options:
To force the RTSP to use UDP insted TCP, you can change the enviroment variable OPENCV_FFMPEG_CAPTURE_OPTIONS.
In C/C++ it can be done like that:
#if WIN32
_putenv_s("OPENCV_FFMPEG_CAPTURE_OPTIONS", "rtsp_transport;udp");
#else
setenv("OPENCV_FFMPEG_CAPTURE_OPTIONS", "rtsp_transport;udp", 1);
#endif
cap = VideoCapture("rtsp://192.168.0.100:554/onvif1", cv::CAP_FFMPEG);
On Python, I think you can change the environment variable doing that:
import os
os.environ["OPENCV_FFMPEG_CAPTURE_OPTIONS"] = "rtsp_transport;udp"
cap = cv2.VideoCapture("rtsp://192.168.0.100:554/onvif1", cv2.CAP_FFMPEG)
I tested only the C++ solution, the Python one I'm not sure. Please test.
OPENCV_FFMPEG_CAPTURE_OPTIONS
# file package/__main__.py
import os
from multiprocessing import Process
from package.main import run
if __name__ == '__main__':
os.environ["OPENCV_FFMPEG_CAPTURE_OPTIONS"] = "rtsp_transport;udp"
p = Process(target=run)
p.start()
p.join()
# file package/main.py
import numpy as np
import cv2
def run():
capture = cv2.VideoCapture("rtsp://192.168.1.150/onvif1", cv2.CAP_FFMPEG)
while True:
result, frame = capture.read()
cv2.imshow('video', frame)
if cv2.waitKey(16) == ord("q"):
break