Использование фильтров DirectShow вне DirectShow? - PullRequest
2 голосов
/ 11 августа 2010

В настоящее время я имею дело с Windows Media Foundation.Однако из-за некоторых проблем с декодером Microsoft H.264 и некоторых отсутствующих декодеров для пользовательского формата я хотел бы знать, возможно ли создать экземпляр DirectShow Decoder напрямую с помощью CLSID и построить вокруг него прокси-сервер, который предоставляет IMFTransformполучить декодер для Media Foundation.Итак, вот мой вопрос:

Могу ли я создать экземпляр фильтра Directshow (предпочтительно декодеров) напрямую и использовать их для декодирования (т.е. поместить несколько сжатых кадров и получить несжатые) для создания MFT?

Я знаю, как создать экземпляр самого фильтра, используя его CLSID.Тем не менее, я понятия не имею, как использовать реальную функциональность декодирования.

Любые идеи, подсказки, ссылки - все, что будет оценено.Спасибо,

J.

Ответы [ 2 ]

5 голосов
/ 21 декабря 2010

(заявление об отказе: на самом деле я никогда этого не делал, но не вижу технической причины, по которой это невозможно. Итак, YMMV) * ​​1001 *

Если декодер является фильтром DMO, тогда это будет намного проще - вы можете поговорить с ним через IMediaObject . Это не сильно отличается от того, как DirectShow использует DMO; он просто оборачивает DMO другим фильтром преобразования, который обрабатывает согласование типов мультимедиа и передачу выборки, но ничто не мешает вам сделать это в вашем собственном приложении.

Есть одна загвоздка: для IMediaObject :: ProcessInput и IMediaObject :: ProcessOutput вам понадобится ваш собственный буферный класс, который реализует IMediaBuffer . Но это довольно простой интерфейс, так что я не думаю, что у вас будет слишком много проблем с его реализацией. Вот базовая реализация .

Для обычных фильтров DirectShow на самом деле это будет намного сложнее, поскольку большинство фильтров DirectShow действительно зависят от наличия внешнего графа (наглядный пример: все события DirectShow-события предполагают существование этого графа). , Если вы действительно хотите использовать один отдельный фильтр DShow, вам, вероятно, придется обернуть весь график фильтра, а затем создать собственный фильтр источника для подачи образцов. Вы можете использовать инструмент захвата образцов (или пользовательский фильтр рендеринга), чтобы вытащить образцы из графика и выставить для остальной части приложения. (одна из сумасшедших идей - даже обернуть этот граф в реализацию фильтра DMO, а затем использовать IMediaObject, чтобы поговорить с ним - однако это может быть сложно)

К счастью большинство декодеров имеют тенденцию быть реализованными как фильтры DMO, поэтому я думаю, что есть большая вероятность, что вы можете просто использовать IMediaObject.

2 голосов
/ 16 октября 2011

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

Если вы не хотите использовать традиционные исходные фильтры файлов / сетей или традиционные средства визуализации, вы можете написать средства визуализации буфера и источник буферафильтры, на которые вы передаете указатели и получаете указатели.Затем вы можете поместить весь беспорядок в график и запустить его, и использовать декодер практически напрямую, без чего-либо еще.Это не составит труда сделать.Хотя декодер, вероятно, ожидает поток пакетов PES.

...