2012-01-19 2 views
4

Я работаю над медиаплеером, используя Media Foundation. Я хочу поддерживать воспроизведение файлов VOB. Однако медиа-фонд в настоящее время не поддерживает контейнер VOB. Поэтому я хочу использовать DirectShow для этого.Могу ли я получить необработанные видеокадры с DirectShow без воспроизведения

Моя идея здесь заключается не в том, чтобы использовать альтернативный путь с использованием графика DirectsShow, а просто захватить видеокадр и передать его в тот же конвейер в среде носителя. В медиа-фонде у меня есть «IMFSourceReader», который просто считывает кадры из видеофайла. Есть ли прямой эквивалент шоу, который просто дает мне фреймы без необходимости создания графика, начала цикла воспроизведения, а затем пытается извлечь кадры из вывода penders? (Чтобы быть более ясным, DirectShow поддерживает архитектуру, в которой он может дать мне необработанные кадры без фактического воспроизведения видео?)

Я читал об ISampleGrabber, но его устарел, и я думаю, что это не подойдет моей архитектуре , Раньше я не работал над DirectShow.

Спасибо, Mots

ответ

6

Вы должны построить график и принимать кадры из соответствующего парсер/демультиплексор фильтра, который будет читать контейнер и поставить отдельные кадры на его выходе.

Воспроизведение не обязательно должно быть в режиме реального времени, а также не нужно подделывать эти видеокадры. После того, как вы получите данные, которые вам нужны в фильтре Sample Grabber или в клиенте, вы можете завершить конвейер с помощью Null Renderer. То есть вы можете организовать получение кадров, которые вам нужны более или менее удобным способом.

+0

Спасибо за подсказку, хотя я не совсем уверен, как этого добиться. Из примеров, которые я видел в DirectShow, мы строим график, топологию и все, а затем вызываем «Run» на диспетчере. Метод «Run» запускает цикл воспроизведения видео. Итак, вы имеете в виду мою топологию, я помещаю нулевой рендер и вызываю «Run», и фильтр Sample Grabber будет периодически получать кадры для каждого кадра? Я думал, что если бы он предложил что-то, в котором я бы инициализировал DirectShow с видеофайлом, загружать необходимые декодеры, и я мог бы повторно называть «Read» на нем и получать кадры видеоматериалов. –

+4

В DirectShow (в отличие от MF) график не обеспечивает много связи между фильтрами. Как только вы создаете граф/конвейер и запускаете удар, фильтры сами по себе передают данные. То есть для захвата фреймов вам нужен либо собственный фильтр в конвейере рядом с VOB-контейнером (или, альтернативно, видеодекодер, если вам нужны декодеры), иначе вы можете использовать настройку фильтра Sample Grabber, чтобы дать вам обратный вызов через его метод «SampleCB». Затем, как только вы запустите график, вы получите все видеофрагменты по одному в этом обратном вызове. –

+3

Как я уже сказал, вы можете получать необработанные и/или декодированные видеофрагменты, в зависимости от того, включаете ли вы свою «точку захвата» до или после видеодекодера. Вы можете даже иметь два граббера там до и после, и у вас будет обратный вызов как для необработанного, так и для декодированного видеокадра. –

0

Вы можете использовать Monogram frame grabber filter для подключения выходного сигнала фильтра VOB DS - он отлично работает. См. Там комментарии о том, как подключить вывод к внешнему приложению.

Смежные вопросы