(отказ от ответственности: Я никогда на самом деле сделали это, но я не вижу никаких технических причин не может быть сделано так, YMMV.)
Если декодер является DMO фильтр, то его будет намного проще - вы можете поговорить с ним через IMediaObject. Это не сильно отличается от того, как DirectShow использует DMO; он просто обертывает DMO другим фильтром преобразования, который обрабатывает согласование типа носителя и прохождение образца, но нет ничего, что помешает вам сделать это в своем собственном приложении.
Есть один улов: для IMediaObject :: ProcessInput и IMediaObject :: ProcessOutput вам понадобится собственный класс буфера, который реализует IMediaBuffer. Но это довольно простой интерфейс, поэтому я не думаю, что у вас будет слишком много проблем с его внедрением. Вот basic implementation.
Для обычных фильтров directshow на самом деле это будет намного сложнее, потому что большинство фильтров DirectShow действительно зависят от наличия внешнего графика (пример: все события, связанные с directshow, предполагают существование этого графика). Если вы действительно хотите использовать отдельный фильтр DShow отдельно, вам, вероятно, придется обернуть весь график фильтра, а затем создать собственный фильтр источника для подачи проб. Вы можете использовать образец grabber (или собственный фильтр визуализации) для выгружать образцы из графика и выставлять остальную часть приложения. (Один вид сумасшедшая идея будет даже обернуть этот график в ДМО реализации фильтра, а затем использовать IMediaObject, чтобы поговорить с ним - это может быть сложно, однако)
К счастью большинство декодеры, как правило, реализуется как DMO, поэтому я думаю, что есть большая вероятность, что вы можете просто использовать IMediaObject.
Возможно, вы могли бы просто «вручную» вызвать различные методы фильтрации на нем ... – rogerdpack
Связанный вопрос: http://stackoverflow.com/questions/6016329/about-using-directshow-filters-outside-directshow – wimh