Проблема с записью DirectShow - fps

Я просто создаю простой график для записи видео из исходного фильтра:

SourceFilter ---> Muxer ---> FileWriter

Я могу сохранить видео, поступающее из SourceFilter, на свой локальный диск.

But when i try to play the recorded video, it play in "slow motion" :-).

Конечно, есть проблема с fps (кадром в секунду). Как я могу это исправить? Любые идеи?

PS:

Чтобы проверить, дает ли мой SourceFilter правильный fps, я просто создаю другой график:

SourceFilter ---> Video Decoder ---> Video Renderer

и он играет с правильной скоростью (fps)

Подробнее:

SourceFilter(*.mp4 file format) ---> Avi Mux Filter ---> File writer Filter

Эта запись, но с неправильным fps.

Когда я пробую gdcl MP4 Mux (можно увидеть здесь), я успешно получаю правильный fps.

SourceFilter(*.mp4 file format) ---> GDCL MPEG 4 Mux Filter ---> File writer Filter

Другой сценарий

SourceFilter( *.h264 file format) ---> Avi Mux Filter ---> File writer Filter
SourceFilter( *.h264 file format) ---> GDCL MPEG 4 Mux Filter---> File writer Filter

Он записывает, но записанный файл не воспроизводится.

И на самом деле я не хочу ничего декодировать ... Просто запишите исходно закодированные видеокадры (mp4, h264) в файл. А также мне может не понадобиться синхронизация звука с видео ... Зачем нужен Mux?

Мой идеальный фильтр должен быть таким:

SourceFilter(whatever format) ---> File writer

person DSBoy    schedule 30.05.2011    source источник
comment
Это может помочь, если вы добавите в вопрос информацию о формате файла и кодеке.   -  person Ralf    schedule 30.05.2011
comment
Спасибо, Ральф. Форматы файлов - mp4 и h264. Я поместил более подробную информацию в свой вопрос в разделе более подробной информации. @Ralf   -  person DSBoy    schedule 30.05.2011
comment
Раньше я сталкивался с подобной проблемой с AVI mux, к сожалению, это было так давно, я не могу вспомнить, в чем проблема была в моем случае. Вы устанавливаете AvgTimePerFrame для VIDEOINFOHEADER в исходном фильтре в соответствии с msdn.microsoft.com/en-us/library/dd318188 (v = vs.85) .aspx?   -  person Ralf    schedule 30.05.2011
comment
На самом деле, пока я просто использую GraphEdit ... Ничего не программирую ... Я не делаю никаких изменений в фильтре SOURCE.   -  person DSBoy    schedule 30.05.2011


Ответы (2)


Комментарий Ральфа, вероятно, прав. Формат файла AVI не имеет покадровых временных меток, только среднюю частоту кадров. Поэтому, когда приходит кадр, мультиплексор должен решить, поместить ли этот кадр в следующий «слот» или вставить маркер «пропущенного кадра» и поместить кадр в следующий слот. Если временные метки исходного фильтра не соответствуют частоте кадров медиа-типа, вы получите этот эффект.

Вы можете сохранить элементарный видеопоток в файл, но используйте пример фильтра дампа, а не средство записи файлов. У модуля записи файлов есть специальный протокол, позволяющий мультиплексорам произвольный доступ к файлу (с использованием временных меток в качестве смещений файлов). Вы хотите просто сохранить данные в виде потока, и пример Dump это делает.

person Geraint Davies    schedule 31.05.2011
comment
Еще один пример для уточнения ответа Герайнта: при использовании кодека H.264 Intel 2012 Media SDK и мультиплексора .mp4 отброшенные кадры захвата, по-видимому, полностью игнорируются. Хотя это не важно в среде транскодирования (поскольку кадры никогда не пропадают), это серьезное ограничение при захвате, поскольку длина фильма будет сокращена на количество пропущенных кадров. - person Jay Borseth; 15.01.2012

В моем случае у меня действительно был фильтр Source, который неправильно установил AvgTimePerFrame. После того, как я исправил это (это был мой собственный фильтр источника), AVI также пошел вместе со всем, что он получил от восходящего потока.

person Ruud van Gaal    schedule 01.06.2012