2013-07-02 2 views
0

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

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 "No combination of intermediate filters could be found to make the connection."

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

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

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

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

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

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

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

1

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

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