【问题标题】:opencv read error:[h264 @ 0x8f915e0] error while decoding MB 53 20, bytestream -7opencv 读取错误:[h264 @ 0x8f915e0] 解码 MB 53 20 时出错,字节流 -7
【发布时间】:2018-08-20 08:48:36
【问题描述】:

我的配置:

  ubuntu 16.04
  opencv 3.3.1
  gcc version 5.4.0 20160609
  ffmpeg version 3.4.2-1~16.04.york0

我使用以下方法构建了 opencv:

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D PYTHON_EXECUTABLE=$(which python) -D OPENCV_EXTRA_MODULES_PATH=/home/xxx/opencv_contrib/modules -D WITH_QT=ON -D WITH_OPENGL=ON -D WITH_IPP=ON -D WITH_OPENNI2=ON -D WITH_V4L=ON -D WITH_FFMPEG=ON -D WITH_GSTREAMER=OFF -D WITH_OPENMP=ON -D WITH_VTK=ON -D BUILD_opencv_java=OFF -D BUILD_opencv_python3=OFF -D WITH_CUDA=ON -D ENABLE_FAST_MATH=1 -D WITH_NVCUVID=ON -D CUDA_FAST_MATH=ON -D BUILD_opencv_cnn_3dobj=OFF -D FORCE_VTK=ON  -D WITH_CUBLAS=ON -D CUDA_NVCC_FLAGS="-D_FORCE_INLINES" -D WITH_GDAL=ON -D WITH_XINE=ON -D BUILD_EXAMPLES=OFF -D BUILD_DOCS=ON -D BUILD_PERF_TESTS=OFF -D BUILD_TESTS=OFF  -D BUILD_opencv_dnn=OFF -D BUILD_PROTOBUF=OFF -D opencv_dnn_BUILD_TORCH_IMPORTER=OFF -D opencv_dnn_PERF_CAFFE=OFF -D opencv_dnn_PERF_CLCAFFE=OFF -DBUILD_opencv_dnn_modern=OFF -D CUDA_ARCH_BIN=6.1 ..

并使用这些python代码来阅读和展示:

import cv2
from com.xxx.cv.core.Image import Image

capture=cv2.VideoCapture("rtsp://192.168.10.184:554/mpeg4?username=xxx&password=yyy")
while True:
    grabbed,content=capture.read()
    if grabbed:
        Image(content).show()
        doSomething()
    else:
        print "nothing grabbed.."

每次读取大约 50 帧后,都会出现如下错误:

[h264 @ 0x8f915e0] error while decoding MB 53 20, bytestream -7

然后什么都抓不到了,奇怪的是:

1,comment doSomething() or
2,keep doSomething() and recording the stream from same IPCamera,then run
  code against recorded video

两种情况,代码都可以正常工作,谁能告诉如何解决这个问题?提前谢谢!

【问题讨论】:

    标签: opencv ffmpeg decode ip-camera


    【解决方案1】:

    我遇到了这个问题,现在刚刚解决了。

    (注意:我用的是python3)

    我怀疑它与时间有关,因为在连续 capture.read() 之间执行昂贵的操作时会出现该错误。你的问题让我确定了这一点。

    此外,当我从网络摄像头(使用 H264 编码)进行流式传输时出现问题,而使用笔记本电脑摄像头时没有问题。

    所以对我有用的解决方案是使用多线程和 python“线程”模块。一个线程流处理其他进程,同时正确管理线程锁,因此不会发生读/写冲突。

    【讨论】:

    • 我遇到了同样的问题,“线程”解决方案解决了我的问题。我使用流式传输 rtps/h264 camera = cv2.VideoCapture("rtsp://192.168.2.210:554/video.mp4") 的 IP 摄像机
    • 当时我并不知道python中的线程不是并行运行的。如果您需要真正的并行性,请在 python 中使用多处理而不是多线程。但是,由于线程调度,多线程似乎解决了这个问题。
    【解决方案2】:

    经过 4 天的研究,我遇到了同样的问题,最后我通过这段代码轻松解决了问题:只需尝试一次

    for(;;) {
            if(!vcap.read(image)) {
                std::cout << "No frame" << std::endl;
                cv::waitKey();
            }
            cv::imshow("Output Window", image);
            if(cv::waitKey(1) >= 0) break;
        }   
    

    【讨论】:

      【解决方案3】:

      这仅适用于视频流:

      如果返回为 False,您只需再次初始化 cv2.VideoCapture。 :)

      为我工作。

      vs = cv2.VideoCapture("rtsp://bla:bla@192.168.x.x")
      while True:
          ret,frame = vs.read()
          if not(ret):
              st = time.time()
              vs = cv2.VideoCapture("rtsp://bla:bla@192.168.x.x")
              print("tot time lost due to reinitialization : ",time.time()-st)
              continue
      
          cv2.imshow("Current frame", frame)
          cv2.waitKey(0)
      

      【讨论】:

        【解决方案4】:

        我在具有 ubuntu 16.04 的系统上使用带有 opencv 3.4 和 python3 的海康威视 ip poe 相机。 相机正在以 h264 格式流式传输。

        使用 RTSP,我使用 opencv 的视频捕获从相机流式传输,有时我在解码 MB 43 20,字节流 -4 时遇到相同的问题“[h264 @ 0x8f915e0] 错误”

        当您在进一步处理中使用捕获的帧并且您在 rtsp 仍在流式传输时在管道中创建延迟时会产生此问题。

        解决方案是将捕获放在不同的线程上,并将您使用的帧放在另一个线程上。

        您将在同一进程中使用 python 多线程:

        #thread1 
        
        global frame 
        frame = None
        cap = cv2.VideoCapture("rtsp://bla:bla@192.168.x.x")
        
        while True:
        ret,frame = cap.read()
        
        
        #thread2
        
        cv2.imshow("Current frame", frame)
        cv2.waitKey(0)
        # you can pass now the frame to your application for further processing
        

        【讨论】:

          【解决方案5】:

          我们先来看一个读取RTSP的简单示例程序

          import cv2
          cap=cv2.VideoCapture("rtsp://admin:admin_123@172.0.0.0")
          
          ret,frame = cap.read()
          while ret:
              ret,frame = cap.read()
              cv2.imshow("frame",frame)
              if cv2.waitKey(1) & 0xFF == ord('q'):
                  break
          cv2.destroyAllWindows()
          cap.release()
          

          帧值是每一帧的图像。但是如果在while代码块中添加对每一帧的识别操作,比如添加Tensorflow来识别里面的小动物,就会报这样的错误,并且会因为这个异常而中断while循环。

          [h264 @ 0x55abeda05080] left block unavailable for requested intra mode
          [h264 @ 0x55abeda05080] error while decoding MB 0 14, bytestream 104435
          

          原来FFMPEG Lib不支持rtsp协议中的H264视频,所以解决方法是写两个不同的线程分别处理每一帧的图像,然后再另外一个线程处理每一帧的图像。

          思路如下:使用队列,采用先进先出的策略,在一个线程中开始接收数据,在另一个线程中逐帧处理数据

          解决方案代码如下:

          import cv2
          import queue
          import time
          import threading
          q=queue.Queue()
          
          def Receive():
              print("start Reveive")
              cap = cv2.VideoCapture("rtsp://admin:admin_123@172.0.0.0")
              ret, frame = cap.read()
              q.put(frame)
              while ret:
                  ret, frame = cap.read()
                  q.put(frame)
          
          
          def Display():
               print("Start Displaying")
               while True:
                   if q.empty() !=True:
                      frame=q.get()
                      cv2.imshow("frame1", frame)
                   if cv2.waitKey(1) & 0xFF == ord('q'):
                          break
                      
          if __name__=='__main__':
              p1=threading.Thread(target=Receive)
              p2 = threading.Thread(target=Display)
              p1.start()
              p2.start()
          

          Receive用作接收数据的线程,Display显示为一个简单的进程。

          【讨论】:

            猜你喜欢
            • 2022-07-01
            • 2016-07-29
            • 2017-05-25
            • 2018-06-09
            • 1970-01-01
            • 2015-06-07
            • 2015-12-30
            • 1970-01-01
            • 2015-08-11
            相关资源
            最近更新 更多