2

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

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

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

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

J.

+0

Возможно, вы могли бы просто «вручную» вызвать различные методы фильтрации на нем ... – rogerdpack

+0

Связанный вопрос: http://stackoverflow.com/questions/6016329/about-using-directshow-filters-outside-directshow – wimh

ответ

5

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

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

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

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

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

2

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

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

+0

as Я упомянул выше, речь идет об использовании устаревших декодеров DirectShow, которые не предоставляют интерфейс DMO (где переход будет довольно простым) в топологии Media Foundatino. –

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