Поведение 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
Который 0x80040217
VFW_E_CANNOT_CONNECT
"Не удалось найти комбинацию промежуточных фильтров для подключения".
что является результатом вашего ручного добавления CLSID_AsyncReader
Файлы Windows Media обычно обрабатываются с помощью другого исходного фильтра (используйте GraphEdit из Windows SDK для визуализации файла, и вы сможете проверить топологию).
Насколько я понимаю, AddSourceFilter может прозрачно создать разделитель. Это правильно?
Да, если сплиттер совместим с Async Reader, что не так.
Если я хочу сделать это вручную, какой компонент я должен использовать?
Используйте GraphEdit для интерактивного создания топологий, и вы поймете, что делать с кодом.
Почему видео WMV отображается в обратном порядке?
Из-за топологии. Скорее всего, у вас есть странная комбинация фильтров на конвейере, в том числе сторонних. Проверка эффективной топологии является ключом к решению проблемы.
Используйте pGraphBuilder->AddSourceFilter(), чтобы добавить фильтр источника для определенного файла. Не думайте, что File Source (Async) является правильным исходным фильтром (для некоторых форматов source и demux объединены в один фильтр).