对于树莓派处理能力低,无法满足实时逐帧处理rtsp视频流,而opencv的VideoCapture又无法清除缓存直接找到最新帧问题,导致处理延时不断积累。查找了网上一些资料,有人提出建立自己的缓存队列,然后抽帧处理,较为复杂,不适于树莓派。
经过尝试可以简单采取如下办法处理:
import cv2
cap = cv2.VideoCapture("rtsp://admin:xxxx@192.168.x.x:554/h264/ch31/main/av_stream")
#ret,frame = cap.read()
ret = cap.isOpened()
fps = cap.get(5)/10000 #查询帧率
while ret:
ret,frame = cap.read()
tstep = cap.get(1)
cv2.imshow("frame",frame)
iloop=fps/2 #每秒处理2帧
while iloop:
cap.grab() #只取帧不解码,
iloop =iloop - 1
if iloop <1 :
break if cv2.waitKey(1) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
cap.release()
通过grab(),进行跳帧,基本处理延时不再积累,增加iloop可以进一步增大跳帧步数。