2013-07-02 52 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]) 

所有這些意味着,該第二編碼樣式創建源具有兩個輸出引腳,並且可能的音頻被映射到第一個。或者,也許,DirectShow會自動插入A/V分離器。

  • 我的理解是,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()爲特定文件添加源過濾器。不要認爲文件源(異步)是正確的源過濾器(對於某些格式,源和解複用器組合爲單個過濾器)。