需要使用cv2.VideoCapture来获取海康摄像机的RTSP流视频。
如果RTSP流视频的链接是正确的,那么很好,没有任何问题,访问也很快。如何链接的IP或端口不对,那么延时就非常高:
import cv2
import time
t1 = time.time()
tmp1 = cv2.VideoCapture('rtsp://admin:12345678@192.168.1.101:554')
tmp1.release()
print(time.time()-t1) # 1.36(秒)
t1 = time.time()
tmp2 = cv2.VideoCapture('rtsp://admin:12345678@192.168.1.101:555')
tmp2.release()
print(time.time()-t1) # 32.3(秒)
为了不一直等待下去,我们需要做一个延时判断,给定一个最大响应时间,如果在该时间内程序仍未执行完成,则立即结束。
pip install func_timeout
import cv2
import time
from func_timeout import func_timeout, FunctionTimedOut
t1 = time.time()
tmp1 = cv2.VideoCapture('rtsp://admin:12345678@192.168.1.101:554')
tmp1.release()
print(time.time()-t1) # 1.36(秒)
t1 = time.time()
try:
tmp2 = func_timeout(3, cv2.VideoCapture, ('rtsp://admin:12345678@192.168.1.101:555',))
except FunctionTimedOut:
print('执行超时')
print(time.time()-t1) # 3.07(秒)
值得注意的是,上述方案虽然解决了当IP或端口有误时cv2.VideoCapture的延时问题,但如果再一次对正常的IP和端口调用cv2.VideoCapture竟然又有非常大的延时,所以就很懵,完全弄不清楚cv2.VideoCapture的逻辑和缓存机制,有兴趣的看一下C++源码吧。