下面的代碼是善於渲染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])
所有這些意味着,該第二編碼樣式創建源具有兩個輸出引腳,並且可能的音頻被映射到第一個。或者,也許,DirectShow會自動插入A/V分離器。
- 我的理解是,AddSourceFilter可以透明地創建一個分離器。這是對的嗎?
- 如果我想手動完成,應該使用哪個組件?
- 爲什麼WMV視頻呈現顛倒?