Сбой приложения IP-камеры OpenCV [h264 @ 0xxxxx] отсутствует изображение в блоке доступа

У меня есть приложение opencv в cpp.

Он захватывает видеопоток и сохраняет его в видеофайлы с помощью простых конструкций из opencv.

Он отлично работает с моей веб-камерой.

Но он падает примерно через десять секунд, пока я запускаю его для захвата потока с IP-камеры.

Моя команда компиляции:

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

Доступ к моему потоку с IP-камеры осуществляется следующим образом:

const string Stream = "rtsp://admin:[email protected]/";

Он отлично работает, показывает видео и сохраняет его до тех пор, пока отображаемое видео не зависнет и приложение не вылетит. В то время как сообщение об ошибке на терминале:

[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!

Насколько я понимаю, первые две строки в приведенном выше сообщении об ошибке могут что-то делать, но на самом деле не приводят к сбою приложения. Последние две строчки наверное причины или повод?

Любая помощь?


person tod    schedule 26.10.2015    source источник
comment
проверьте следующие RTSP UPD и TCP   -  person Pim    schedule 26.10.2015
comment
ну, это может решить то, что на самом деле не является главной проблемой, хорошо! кстати, нет принятого ответа, похоже, еще ведутся дебаты.   -  person tod    schedule 26.10.2015
comment
Можем ли мы увидеть ваш файл cpp? Или какой-то фрагмент кода о том, как вы получаете доступ к потоку камеры?   -  person Manny    schedule 04.11.2015
comment
@ Мэнни Я использую Cap.grab(), и здесь он не схватывается.   -  person tod    schedule 04.11.2015
comment
что -1 это не я, но можете ли вы поделиться своим кодом, я подозреваю, что в вашем коде что-то не так. из того, что вы сказали, кажется, что это отбрасывало кадры, а пустые кадры вызывали проблему.   -  person fireant    schedule 06.11.2015
comment
@fireant все исправлено, и я уже добавил ответ. Пожалуйста, взгляните на это.   -  person tod    schedule 06.11.2015


Ответы (3)


Получил решение после множества проб и ошибок. Просто немного изменил адрес потока, и это сработало.

От:

const string Stream = "rtsp://admin:[email protected]/";

To:

const string Stream = "rtsp://admin:[email protected]/ch1-s1?tcp";

НЕ ПОНИМАЮ, какие изменения это внесло?

НО РАБОТАЕТ ОТЛИЧНО!!!

Даже вездесущие предупреждения формы:

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

пропали.

В любом случае был бы признателен, если бы кто-нибудь мог объяснить это с логической причиной.

ЗАЧЕТ

person tod    schedule 04.11.2015
comment
Я предполагаю, что ваш поток rtsp использовал UDP через TCP, пока вы не указали иное - person Josh; 25.02.2020

Это ошибка ffmpeg. Вероятно, у вас старая версия ffmpeg, и вы можете обновить ее. Он отлично решил проблему для моего случая, переустановив последние версии opencv и ffmpeg следующим образом:

  • #P2# <блочная цитата>
    git clone git://source.ffmpeg.org/ffmpeg.git
    cd ffmpeg 
    ./configure --enable-shared --disable-static 
    make 
    sudo make install
    
  • #P3# <блочная цитата>
    git clone [email protected]:opencv/opencv.git
    cd opencv
    mkdir build
    cd build 
    cmake ../ -DCMAKE_BUILD_TYPE=Release
    make
    sudo make install
    
person thanhtang    schedule 09.11.2016

Как ссылка на исходный ответ, добавление ?tcp в конец заставляет подключение rtsp к запускайте с использованием протокола tcp вместо протокола udp, который полезен, если вы не проверяете активно какие-либо проблемы с подключением и, следовательно, вы не можете позволить себе потерю пакетов.

Для надежной работы вы можете проверить NULL-изображение в своем цикле, и если вы получите NULL-изображение, вы можете сбросить соединение с камерой:

IplImage *img = cvQueryFrame(camera);
        if (img == NULL) {
            printf("img == null ");
            fflush(stdout);
            camera = cvCreateFileCapture("rtsp://admin:[email protected]/ch1-s1?tcp");
        }
person fatihk    schedule 06.11.2015
comment
Перезапуск соединения делает поток ужасным. - person tod; 08.11.2015