最近在使用python版的opencv调用网络摄像头做人脸识别时遇到了一些问题,命令行报错导致rtsp断流。
报错如下:
[h264 @ 0x7fd990026040] left block unavailable for requested intra4x4 mode -1
[h264 @ 0x7fd990026040] error while decoding MB 0 18, bytestream 269
1.开始的想法
代码中的表现为程序运行一段时间后,程序报了以上的错。百度这个错误后,了解到FFMPEGlib对rtsp的H264格式不支持。所以处理方式应该写两个不同的线程,一个接收每一帧图像,另一个线程处理图像。于是学习了别人的方法构造了一个队列,使用两个线程处理程序
链接如下:
[双线程处理rtsp流](https://blog.youkuaiyun.com/darkeyers/article/details/84865363)
2.使用双线程也行不通以及最终解决方法
改成双线程后,运行一段时间后还是报这个错,除了这个错误,还遇到了这个错误
cv2.error: OpenCV(3.4.3) /io/opencv/modules/imgproc/src/resize.cpp:4044: error: (-215:Assertion failed) !ssize.empty() in function 'resize'
看到这个错误,我知道肯定是帧没获取到,于是打断点debug。发现运行一段时间之后,capture.read()返回的ret是False,frame是none。原来是断流了,这可咋整,只能在接收帧图信息时重新建立rtsp流了
def Receive():
print("start Reveive")
cap = cv2.VideoCapture(rtsp)
ret, frame = cap.read()
q.put(frame)
while ret:
ret, frame = cap.read()
if not(ret): #若没有帧返回,则重新刷新rtsp视频流
cap = cv2.VideoCapture(rtsp)
ret, frame = cap.read()
continue
q.put(frame)
不过该方法会导致网络摄像头在视频流过程中丢失1-2秒的视频信息,幸好小规模的应用上数据衔接也没有什么问题,在实时视频上的表现就是卡了1-2秒,并没有什么影响。