Захват видео AVI с DirectShow

Я пытаюсь захватить видео AVI, используя DirectShow AVIMux а также FileWriter Фильтры.
Когда я подключаюсь SampleGrabber фильтр вместо AVIMuxЯ четко вижу, что поток составляет 30 кадров в секунду, однако после захвата видео каждый кадр дублируется 4 раза, и я получаю 120 кадров вместо 30. Фильм в 4 раза медленнее, чем должен быть, и только первый кадр в набор из 4 является ключевой кадр.
Я попробовал тот же эксперимент с 8 кадрами в секунду, и для каждого полученного изображения у меня было 15 кадров в видео. И в случае 15 кадров в секунду я получал каждый кадр 8 раз.

Я пытался как написать код на C ++, так и протестировать его с помощью Graph Edit Plus.
Есть ли способ, которым я могу это контролировать? Может быть, некоторые ограничения на AVIMux фильтр?

0

Решение

Вы не указываете свой формат захвата, который может иметь какое-то отношение к проблеме, но обычно это выглядит так, как будто график при записи в файл имеет некоторое узкое место, которое препятствует продолжению потока со скоростью 30 кадров в секунду. Камера пытается выдавать кадры со скоростью 30 кадров в секунду, и это будет происходить до тех пор, пока буферы будут переработаны для ее заполнения.

Но здесь буферы недоступны, потому что средство записи файлов загружает их на диск. Фильтр захвата голодает, и в этой ситуации он увеличивает счетчик «пропущенных кадров», который перемещается с каждым захваченным кадром. AVIMux использует этот счетчик для вставки в файл AVI индикатора, который фактически говорит: «Здесь должен быть доступен кадр для записи в файл, но его нет; во время воспроизведения повторите последний кадр». Таким образом, файл должен иметь заполнители на 30 кадров в секунду — некоторые заполнены реальными кадрами, а некоторые — пропущенными кадрами.

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

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector