У меня есть приложение C ++ для машинного зрения, связанное с библиотеками ffmpeg, которое предоставляет кадры из видеопотоков в процедуры анализа. Идея заключается в том, что можно предоставить умеренно общий идентификатор видеопотока, и этот источник видео будет распаковываться и передаваться кадр за кадром в подпрограмму анализа (которая выполняет функции анализа пользователя). «Среднеобобщенный идентификатор видео» охватывает 3 общих видеопотока. типы: пути к видеофайлам на диске, IP-видеопотоки (камеры или службы потокового видео) и выводы веб-камеры USB с требуемым форматом и скоростью.
Мой текущий видеопроигрыватель по возможности универсален: только видео, игнорируя аудио и другие потоки. Он имеет случай переключения для извлечения частоты кадров потока на основе источника потока и кодека, который используется для оценки задержки между распаковыванием кадров. У меня было много проблем с попыткой получить надежные временные метки из потоков, поэтому в настоящее время я игнорирую pts и dts. Я знаю, что игнорирование pts / dts плохо для потоков с переменной частотой кадров. Я планирую особый случай их позже. В настоящее время проигрыватель проверяет, не задержался ли последний распакованный кадр более чем на 2 кадра (при условии постоянной частоты кадров), и если это так, «отбрасывает кадр» - не передает его в процедуру анализа пользователя.
По сути, логика видеопроигрывателя определяет, когда пропустить кадры (не передавать их в процедуру анализа, отнимающую много времени), поэтому анализ подается видеокадрам как можно ближе к реальному времени.
Я ищу примеры или дискуссии о том, как можно инициализировать и / или поддерживать их AVFormatContext, AVStream и AVCodecContext, используя (предположительно, но не ограничиваясь) параметры AVDictionary, так что удаление кадров, необходимое для поддержания реального времени, выполняется в библиотеках libav. уровень, а не на моем уровне видео плеер. Если для достижения этого требуются отдельные AVDictionaies (или более) для каждого типа потока и кодека, то так и будет. Я заинтересован в понимании плюсов и минусов обоих подходов: отбрасывание кадров на уровне проигрывателя или на уровне libav.
(Когда для некоторого анализа требуется каждый кадр, существующая реализация проигрывателя с отключенным сбросом кадров вполне подходит. Я подозреваю, что если мне удастся добиться сброса кадров на уровне libav, я также сохраню время распаковки пакетов в кадры, сократив обработку больше, чем моя текущая версия.)