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