Поведение AddSourceFilter

Следующий код хорош для рендеринга файла MPG без звука:

IBaseFilter *pRenderer;
CoCreateInstance(CLSID_VideoRenderer, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pRenderer)));
IFileSourceFilter *pSourceFilter;
IBaseFilter *pBaseFilter;
CoCreateInstance(CLSID_AsyncReader, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pSourceFilter));
pSourceFilter->QueryInterface(IID_PPV_ARGS(&pBaseFilter));
pGraphBuilder->AddFilter(pRenderer, L"Renderer Filter");
pSourceFilter->Load(filename, NULL);
pGraphBuilder->AddFilter(pBaseFilter, L"File Source Filter");

Но терпит неудачу с файлом WMV со звуком. Ошибка происходит при следующем вызове, когда я подключаю единственный выход видеоисточника к единственному входу видео рендерера.

pGraphBuilder->Connect(pOutPin[0], pInPin[0])

Который возвращает -2147220969. Если я заменю приведенный выше код следующим:

IBaseFilter *pRenderer;
CoCreateInstance(CLSID_VideoRenderer, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pRenderer));
IBaseFilter *pBaseFilter;
pGraphBuilder->AddSourceFilter(filename, L"Renderer Filter", &pBaseFilter);
pGraphBuilder->AddFilter(pRenderer, L"Renderer Filter");

тогда MPG играет хорошо с:

pGraphBuilder->Connect(pOutPin[0], pInPin[0])

в то время как WMV приводит к той же ошибке, что и выше, но вместо этого он играет с ног на голову:

pGraphBuilder->Connect(pOutPin[1], pInPin[0])

Все это означает, что второй стиль кодирования создает источник с двумя выходными контактами, и, вероятно, аудио отображается на первый. Или, может быть, A/V-разветвитель вставляется автоматически DirectShow.

  • Насколько я понимаю, AddSourceFilter может прозрачно создать разделитель. Это правильно?
  • Если я хочу сделать это вручную, какой компонент я должен использовать?
  • Почему видео WMV отображается в обратном порядке?

2 ответа

Который возвращает -2147220969

Который 0x80040217VFW_E_CANNOT_CONNECT "Не удалось найти комбинацию промежуточных фильтров для подключения".

что является результатом вашего ручного добавления CLSID_AsyncReaderФайлы Windows Media обычно обрабатываются с помощью другого исходного фильтра (используйте GraphEdit из Windows SDK для визуализации файла, и вы сможете проверить топологию).

Насколько я понимаю, AddSourceFilter может прозрачно создать разделитель. Это правильно?

Да, если сплиттер совместим с Async Reader, что не так.

Если я хочу сделать это вручную, какой компонент я должен использовать?

Используйте GraphEdit для интерактивного создания топологий, и вы поймете, что делать с кодом.

Почему видео WMV отображается в обратном порядке?

Из-за топологии. Скорее всего, у вас есть странная комбинация фильтров на конвейере, в том числе сторонних. Проверка эффективной топологии является ключом к решению проблемы.

Используйте pGraphBuilder->AddSourceFilter(), чтобы добавить фильтр источника для определенного файла. Не думайте, что File Source (Async) является правильным исходным фильтром (для некоторых форматов source и demux объединены в один фильтр).

Другие вопросы по тегам