Как бороться с ошибками декодирования cv::VideoCapture?

Я передаю контент H264 с IP-камеры, используя VideoCapture из OpenCV (скомпилирован с поддержкой ffmpeg).

Пока все работает нормально, но время от времени я получаю ошибки декодирования (я полагаю, из ffmpeg):

[h264 @ 0x103006400] mb_type 137 in I slice too large at 26 10
[h264 @ 0x103006400] error while decoding MB 26 10
[h264 @ 0x103006400] negative number of zero coeffs at 25 5
[h264 @ 0x103006400] error while decoding MB 25 5
[h264 @ 0x103006400] cbp too large (421) at 35 13
[h264 @ 0x103006400] error while decoding MB 35 13
[h264 @ 0x103006400] mb_type 121 in P slice too large at 20 3
[h264 @ 0x103006400] error decoding MB 20 3

Эти сообщения отображаются в консоли. Есть ли какой-нибудь чистый способ послушать их? Я бы хотел пропустить обработку глючных кадров.

Любые подсказки/советы?


person George Profenza    schedule 24.07.2012    source источник
comment
столкнулся с той же проблемой.... любое решение???   -  person tod    schedule 26.10.2015


Ответы (3)


Недавно я решил ту же проблему и попытался объяснить шаги, которые я выполнил.

я обновил самую последнюю opencv_ffmpeg.dll (я переименовал opencv_ffmpeg.dll в opencv_ffmpeg310 .dll для использования с OpenCV 3.1, также переименованная в ту же dll opencv_ffmpeg2412.dll для использования с OpenCV 2.4.12

благодаря этому базовый захват кадров и отображение стали успешными без проблем. Но все же та же проблема, если я выполняю некоторую обработку или обнаружение изображений, вызывает задержку между захватом кадров.

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

здесь вы можете найти мой тестовый код (это нужны некоторые доработки вроде использования мьютекса и блокировки памяти при обновлении мата)

я надеюсь, что информация будет полезной (извините за мой плохой английский)

person sturkmen    schedule 24.02.2016
comment
Я еще не пробовал это, но это выглядит намного элегантнее, чем попытки передать сообщения об ошибках и пропустить кадры. - person George Profenza; 24.02.2016
comment
недавно мой подход объяснил Маре в своем блоге - person sturkmen; 27.03.2016

У меня такая же проблема. Мне кажется, что проблема в том, что источник, создающий поток, медленнее, чем тот, который декодирует. Вероятно, для декодирования у вас есть бесконечный цикл чтения кадров и их декодирования, что может быть быстрее, чем то, что может отправить вам ваш источник.

Я не знаю, как остановиться и подождать, пока буфер не заполнится.. Я использую файл, такой, что мой источник камеры записывает файл, и я читаю кадры из него в своей программе декодирования. Пока не могу их синхронизировать

person Nacho    schedule 24.06.2014
comment
вы правы, у меня был бесконечный цикл, но я не нашел решения проблемы. Я думал о конвейере в выводе консоли из opencv/ffmpeg и использовании кадров только тогда, когда не было обнаружено ошибок декодирования в качестве хакерской работы, но не удосужился реализовать это или найти более элегантное решение. - person George Profenza; 24.06.2014
comment
Я думал о том же, но я понятия не имею, как это сделать.. :/ - person Nacho; 24.06.2014

то, что сказал sturkmen, абсолютно верно, версия opencv 2413, и по какой-то причине я не могу обновить opencv до 310 , я знаю, что для opencv310 не будет такой ошибки декодирования. Итак, во-первых, я копирую lib opencv_ffmpeg310_64.dll в папку с исполняемым файлом E:\GITHUB\JpegRtspCamera\vs2013\JpegRtspCamera\x64\Release.

затем я просто удаляю opencv_ffmpeg2413.dll и меняю имя opencv_ffmpeg310_64.dll на opencv_ffmpeg2413.dll. оно работает!!!

person Chuckie Pan    schedule 21.06.2018