2012-06-18 94 views
2

我在想如何在directshow中選擇音頻輸出設備。我能夠在directshow中獲得可用的音頻輸出設備。但我怎樣才能使其中的一個成爲音頻輸出設備。它總是用於默認的音頻設備。我希望能夠在我選擇的設備上輸出音頻。我一直在通過谷歌掙扎,但找不到任何有用的東西。我所能得到的只是this鏈接,但它並不能真正解決我的問題。如何在directshow中選擇音頻輸出設備

任何幫助對我都會很有幫助。

回答

3

用戶需要管理音頻設備並選擇主設備(例如通過控制面板小程序)。你可以找到方法switch devices programmatically in Windows XP,但在Vista + it is impossible without interactive user action設計。

又見拉里的答案在這裏:How to change default sound playback device programatically?

UPD。上面提到的是修改系統配置,試圖改變默認的音頻輸出設備。然而,應用程序不僅限於默認設備。相反,它可以枚舉可用設備(請參閱Using the System Device Enumerator + CLSID_AudioRendererCategory),然後通過BindToObject調用爲特定設備創建一個渲染器實例。從那裏開始,它是一個常規過濾器,只是內部綁定到感興趣的設備上。

+0

就個人而言,我不知道如何這是「答案」,因爲Vibhore從來沒有問過如何改變其音頻設備設置爲默認值 - 有或沒有用戶交互。 相反,這個問題清楚地問,如何輸出到音頻設備以外的默認音頻設備。例如,在很多遊戲/音頻相關的應用程序中,向用戶呈現包含可用回放設備列表的列表框,他/她可以從中選擇列表框。所選設備是應用程序/遊戲將用於音頻輸出的設備。 –

+0

@Digital_Utopia:好點,現在有希望更好的答案。 –

+0

好得多;) 我在看到您的更新之前添加了我的答案。由於我最終搞清楚了自己,我想我會從我自己的項目中添加一個片段作爲例子。 –

3

首先,如果你不使用DirectShow .NET(DirectShowLib),獲取here:它作爲非託管DirectShow和C#

接下來是一個非常簡單的例子之間的(非常完整)接口如何播放音頻文件,爲所需的音頻設備

using DirectShowLib; 

private IGraphBuilder m_objFilterGraph = null; 
private IBasicAudio m_objBasicAudio = null; 
private IMediaControl m_objMediaControl = null; 

private void playAudioToDevice(string fName, int devIndex) 
{ 
    object source = null; 
    DsDevice[] devices; 
    devices = DsDevice.GetDevicesOfCat(FilterCategory.AudioRendererCategory); 
    DsDevice device = (DsDevice)devices[devIndex]; 
    Guid iid = typeof(IBaseFilter).GUID; 
    device.Mon.BindToObject(null, null, ref iid, out source); 

    m_objFilterGraph = (IGraphBuilder)new FilterGraph(); 
    m_objFilterGraph.AddFilter((IBaseFilter)source, "Audio Render"); 
    m_objFilterGraph.RenderFile(fName, ""); 

    m_objBasicAudio = m_objFilterGraph as IBasicAudio; 
    m_objMediaControl = m_objFilterGraph as IMediaControl; 

    m_objMediaControl.Run(); 
} 
+2

在這段代碼片段中,一個弱點是'RenderFile'調用。是的,它經常會發現預先添加的渲染器,並且總是在這個簡單的示例中,但是直接連接引腳更加可靠。也就是說,當渲染器的引腳明確連接時。 –

相關問題