我有一個C#控件包裝在DirectShow庫中。雖然我不確定它是否相關,但我正在使用Windows CE 6.0R3。當試圖使用控制發揮WMA音頻文件,下面的代碼拋出的"No such interface supported"
異常:IVideoWindow :: put_WindowStyle拋出「沒有這樣的接口支持」
m_graph = new DShowGraph(mediaFile);
m_graphBuilder = m_graph.Open();
m_videoWindow = (IVideoWindow)m_graph.GetVideoWindow();
if (m_videoWindow == null)
{
// this is not hit
}
try
{
m_videoWindow.put_WindowStyle((int)(WS.CHILD | WS.VISIBLE | WS.CLIPSIBLINGS));
}
catch (Exception ex)
{
// I end up here
}
的Open
調用看起來像這樣(錯誤處理等修整):
private IGraphBuilder _graphBuilder;
internal IGraphBuilder Open()
{
object filterGraph = ClassId.CoCreateInstance(ClassId.FilterGraph);
_graphBuilder = (IGraphBuilder)filterGraph;
_graphBuilder.RenderFile(_input, null);
return _graphBuilder;
}
該GetVideoWindow調用只是看起來是這樣的:
public IVideoWindow GetVideoWindow()
{
if (_graphBuilder == null)
return null;
return (IVideoWindow)(_graphBuilder);
}
奇怪的是,這一切工作只是罰款與同一控制DLL,相同的應用程序和相同的媒體FIL當在Windows CE 5.0下運行時。
我懷疑它可能與我們播放純音頻文件(檢查現在是否與視頻文件出現相同問題)有關,但我並不太熟悉直接顯示,所以我想了解這裏發生了什麼。
在調試中遇到的一個巨大挑戰是我的辦公室沒有失敗的硬件 - 它在客戶的網站,所以我必須進行更改,發送並等待回覆。雖然這不會影響問題,但確實會影響我快速跟進建議或跟蹤任何人可能遇到的問題的能力。
EDIT1
播放WMV文件正常工作,所以它與文件是純音頻。我們無法測試MP3以查看它是否是WMA編解碼器問題,因爲設備OEM由於擔心許可問題而未在操作系統中包含MP3編解碼器。
是的,那是我的懷疑。奇怪的是,它在CE 5.0中都有效,表明底層的Direct Show實現必須在CE 5.0和6.0之間進行更改。現在,我只是看媒體文件的擴展名(WMA或MP3),以確定它是否只有音頻(是否有一種方法可以詢問圖是否存在視頻渲染器?),並跳過「IVideoWindow」初始化,如果我認爲它是。 – ctacke
我想說,現在捕捉到'E_NOINTERFACE'錯誤是最容易看到的視頻渲染器是否存在。只有視頻渲染器支持它(在桌面上,某些視頻渲染器會渲染視頻並且不支持此接口)。是的,你可以枚舉過濾器並直接從它們查詢'IVideoWindow'接口,我只是不確定它是否值得打擾。 –
感謝您的建議。我現在捕捉異常並設置「無視頻渲染器」標誌,因此我可以跳過IVideoWindow初始化代碼的剩餘部分。 – ctacke