opencv读取网络摄像头的rtsp流时发生断流现象,以及该问题的解决

最近在使用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.csdn.net/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秒,并没有什么影响。

如果有大佬有更好的解决方法请告知一下,多谢了。

你可能感兴趣的:(计算机视觉)