В 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?