Декодеры DirectShow сбрасывают время мультимедиа - PullRequest
1 голос
/ 29 декабря 2010

В DirectShow образец мультимедиа имеет два связанных со временем свойства: его метка времени и время мультимедиа.Мое приложение должно искать определенные кадры в видео и, следовательно, требует времени мультимедиа.Однако, как представляется, большинство фильтров декодера не передают эту информацию.

У меня есть график DirectShow, который выглядит следующим образом:

[File Source (Async.)] -> [AVI Splitter] -> [<Video decoder>] -> [My filter]

Я пробовал следующие видеодекодеры:

  • DMO Wrapper Filter с декодером Mpeg4s DMO (это стандарт по умолчанию для MPEG-4 на моей машине)
  • Xvid MPEG-4 Video Decoder
  • MainConcept (Demo) MPEG-4 Видеодекодер
  • Видеодекодер ffdshow (попытки ffdshow)

Из этих четырех только декодер ffdshow производит выборки со временем мультимедиа.Остальные три только устанавливают отметку времени, но оставляют время носителя пустым.Это кажется странным, поскольку для каждого сэмпла, получаемого от разветвителя AVI, правильно установлено время мультимедиа.

Кто-нибудь знает, почему это происходит?Есть ли обходной путь для получения времени мультимедиа, которое работает надежно, даже когда приложение постоянно просматривает видео?

Редактировать (в ответ на kidjan):

Давайте предположим,Я хочу прочитать видео кадр № 100.С файлом 25fps этот кадр занимает 4 секунды в видео.Используя интерфейс IMediaSeeking графа фильтра, я стремлюсь к этой позиции.Внутри этот запрос на поиск направляется в фильтр разделителя (в примере разделитель AVI).Однако есть две потенциальные проблемы:

  • В зависимости от формата видео, я не могу быть уверен, что сплиттер сможет точно искать кадр # 100.Вместо этого он может достичь кадра № 95, и мне придется прочитать 5 кадров, прежде чем получить правильный кадр.
  • Разветвитель может быть с точностью до кадра, но из-за асинхронной природы DirectShow следующий кадр, полученный с помощьюФильтр декодера может быть реликтом перед поиском.Если фильтр декодера использует многопоточность, он может доставить этот кадр после действия поиска.

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

С чем сводится мой вопрос:
Как я могу получить определенный видеокадр (по номеру) в графе DirectShow?

Ответы [ 2 ]

0 голосов
/ 10 января 2011

Не все декодеры следуют всем правилам DirectShow, поэтому вам придется смириться с потерей времени мультимедиа.Если вы работаете только с файлами AVI, просто полагайтесь на точность сплиттера при использовании IMediaSeeking и используйте Stop () и Pause () IMediaControl соответствующим образом, чтобы гарантировать, что все кэшированные кадры будут удалены, и у вас есть нужный вам кадр.С файлом AVI вы можете получить истинную частоту кадров из его заголовка и рассчитать правильное время поиска, если использование мультимедиа не удается.

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

0 голосов
/ 03 января 2011

Я в замешательстве - вам не нужно время мультимедиа, чтобы "... искать конкретные кадры в видео". Почему бы не использовать отметку времени для поиска? Кроме того, поиск обычно обрабатывается исходным фильтром, и нижестоящие фильтры на самом деле не должны делать много. У меня есть график фильтра, который выглядит следующим образом:

[Пользовательский фильтр источника, реализующий IMediaSeeking] -> [Фильтр декодера] -> [Рендерер]

... и все поиски происходят с метками времени, а не с медиа временем. Поэтому я не уверен, почему вы хотите использовать медиа время вместо меток времени.

Используете ли вы IMediaSeeking?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...