OpenCV IP 摄像机应用程序崩溃 [h264 @ 0xxxxx] 访问单元中缺少图片

OpenCV IP camera application crashes [h264 @ 0xxxxx] missing picture in access unit

我在 cpp 中有一个 opencv 应用程序。

它使用 opencv 的简单构造捕获视频流并将其保存到视频文件。

它与我的网络摄像头配合得很好。

但是,它可能会在大约十秒后崩溃,而我 运行 它是为了从 IP Camara 捕获流。

我的编译命令是:

g++ -O3 IP_Camera_linux.cpp -o IP_Camera `pkg-config --cflags --libs opencv`

我的网络摄像头流是这样访问的:

const string Stream = "rtsp://admin:xxxx@192.168.0.101/";

它 运行 完美,显示视频并保存它直到显示的视频冻结和应用程序崩溃。虽然终端上的错误消息是:

[h264 @ 0x15e6f60] error while decoding MB 59 31, bytestream (-20)
[h264 @ 0x15e8200] error while decoding MB 61 27, bytestream (-3)
[h264 @ 0x109c880] missing picture in access unit
[h264 @ 0x109c000] no frame!

据我了解,上述错误消息中的前两行可能与某些问题有关,但实际上并没有使应用程序崩溃。最后两行大概是原因还是原因?

有什么帮助吗?

经过大量的尝试和尝试得到了解决方案。只是稍微更改了流地址并且它起作用了。

发件人:

const string Stream = "rtsp://admin:xxxx@192.168.0.101/";

收件人:

const string Stream = "rtsp://admin:xxxx@192.168.0.101/ch1-s1?tcp";

不知道,它做了什么改变?

但效果很好!!!

甚至是以下形式的无处不在的警告:

[h264 @ 0x15e6f60] error while decoding MB 59 31, bytestream (-20)
[h264 @ 0x15e8200] error while decoding MB 61 27, bytestream (-3) 

都走了。

无论如何,如果有人能解释一下背后的逻辑原因,我们将不胜感激。

CREDIT

作为对 的引用,在末尾添加 ?tcp 会强制使用 tcp 协议而不是 udp 协议将 rtsp 连接到 运行如果您不主动检查任何连接问题,这很有用,因此您不能承受任何数据包丢失。

为了稳健 运行ning,您可以在循环中检查 NULL 图像,如果得到 NULL 图像,您可以重置相机连接:

IplImage *img = cvQueryFrame(camera);
        if (img == NULL) {
            printf("img == null ");
            fflush(stdout);
            camera = cvCreateFileCapture("rtsp://admin:xxxx@192.168.0.101/ch1-s1?tcp");
        }

这是 ffmpeg 的错误。可能你的 ffmpeg 是旧版本,你可能想要更新它。它通过重新安装最新的 opencv 和 ffmpeg 完美地解决了我的问题,如下所示:

  • 安装最新的ffmpeg

    git clone git://source.ffmpeg.org/ffmpeg.git
    cd ffmpeg 
    ./configure --enable-shared --disable-static 
    make 
    sudo make install
    
  • 安装最新的opencv

    git clone git@github.com:opencv/opencv.git
    cd opencv
    mkdir build
    cd build 
    cmake ../ -DCMAKE_BUILD_TYPE=Release
    make
    sudo make install