2012-06-14 21 views
1

我有一個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編解碼器。

回答

2

該圖的IVideoWindow不過是轉發到底層IVideoWindow的視頻呈現過濾器。對於僅音頻流水線,您沒有視頻渲染器(顯然),並且IVideoWindow沒有多大意義。界面仍然可用,但是一旦您嘗試調用方法,就沒有任何內容可以轉發,因此會出現錯誤。

+0

是的,那是我的懷疑。奇怪的是,它在CE 5.0中都有效,表明底層的Direct Show實現必須在CE 5.0和6.0之間進行更改。現在,我只是看媒體文件的擴展名(WMA或MP3),以確定它是否只有音頻(是否有一種方法可以詢問圖是否存在視頻渲染器?),並跳過「IVideoWindow」初始化,如果我認爲它是。 – ctacke

+0

我想說,現在捕捉到'E_NOINTERFACE'錯誤是最容易看到的視頻渲染器是否存在。只有視頻渲染器支持它(在桌面上,某些視頻渲染器會渲染視頻並且不支持此接口)。是的,你可以枚舉過濾器並直接從它們查詢'IVideoWindow'接口,我只是不確定它是否值得打擾。 –

+0

感謝您的建議。我現在捕捉異常並設置「無視頻渲染器」標誌,因此我可以跳過IVideoWindow初始化代碼的剩餘部分。 – ctacke

相關問題