инициализация libavcodec для воспроизведения в реальном времени с пропуском кадров при необходимости - PullRequest
1 голос
/ 20 октября 2019

У меня есть приложение C ++ для машинного зрения, связанное с библиотеками ffmpeg, которое предоставляет кадры из видеопотоков в процедуры анализа. Идея заключается в том, что можно предоставить умеренно общий идентификатор видеопотока, и этот источник видео будет распаковываться и передаваться кадр за кадром в подпрограмму анализа (которая выполняет функции анализа пользователя). «Среднеобобщенный идентификатор видео» охватывает 3 общих видеопотока. типы: пути к видеофайлам на диске, IP-видеопотоки (камеры или службы потокового видео) и выводы веб-камеры USB с требуемым форматом и скоростью.

Мой текущий видеопроигрыватель по возможности универсален: только видео, игнорируя аудио и другие потоки. Он имеет случай переключения для извлечения частоты кадров потока на основе источника потока и кодека, который используется для оценки задержки между распаковыванием кадров. У меня было много проблем с попыткой получить надежные временные метки из потоков, поэтому в настоящее время я игнорирую pts и dts. Я знаю, что игнорирование pts / dts плохо для потоков с переменной частотой кадров. Я планирую особый случай их позже. В настоящее время проигрыватель проверяет, не задержался ли последний распакованный кадр более чем на 2 кадра (при условии постоянной частоты кадров), и если это так, «отбрасывает кадр» - не передает его в процедуру анализа пользователя.

По сути, логика видеопроигрывателя определяет, когда пропустить кадры (не передавать их в процедуру анализа, отнимающую много времени), поэтому анализ подается видеокадрам как можно ближе к реальному времени.

Я ищу примеры или дискуссии о том, как можно инициализировать и / или поддерживать их AVFormatContext, AVStream и AVCodecContext, используя (предположительно, но не ограничиваясь) параметры AVDictionary, так что удаление кадров, необходимое для поддержания реального времени, выполняется в библиотеках libav. уровень, а не на моем уровне видео плеер. Если для достижения этого требуются отдельные AVDictionaies (или более) для каждого типа потока и кодека, то так и будет. Я заинтересован в понимании плюсов и минусов обоих подходов: отбрасывание кадров на уровне проигрывателя или на уровне libav.

(Когда для некоторого анализа требуется каждый кадр, существующая реализация проигрывателя с отключенным сбросом кадров вполне подходит. Я подозреваю, что если мне удастся добиться сброса кадров на уровне libav, я также сохраню время распаковки пакетов в кадры, сократив обработку больше, чем моя текущая версия.)

1 Ответ

1 голос
/ 20 октября 2019

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

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

Вы можете пропустить преобразование цветового пространства и изменить его размер, но часто об этом позаботится игрок.

...