我在想如何在directshow中選擇音頻輸出設備。我能夠在directshow中獲得可用的音頻輸出設備。但我怎樣才能使其中的一個成爲音頻輸出設備。它總是用於默認的音頻設備。我希望能夠在我選擇的設備上輸出音頻。我一直在通過谷歌掙扎,但找不到任何有用的東西。我所能得到的只是this鏈接,但它並不能真正解決我的問題。如何在directshow中選擇音頻輸出設備
任何幫助對我都會很有幫助。
我在想如何在directshow中選擇音頻輸出設備。我能夠在directshow中獲得可用的音頻輸出設備。但我怎樣才能使其中的一個成爲音頻輸出設備。它總是用於默認的音頻設備。我希望能夠在我選擇的設備上輸出音頻。我一直在通過谷歌掙扎,但找不到任何有用的東西。我所能得到的只是this鏈接,但它並不能真正解決我的問題。如何在directshow中選擇音頻輸出設備
任何幫助對我都會很有幫助。
用戶需要管理音頻設備並選擇主設備(例如通過控制面板小程序)。你可以找到方法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
調用爲特定設備創建一個渲染器實例。從那裏開始,它是一個常規過濾器,只是內部綁定到感興趣的設備上。
首先,如果你不使用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();
}
在這段代碼片段中,一個弱點是'RenderFile'調用。是的,它經常會發現預先添加的渲染器,並且總是在這個簡單的示例中,但是直接連接引腳更加可靠。也就是說,當渲染器的引腳明確連接時。 –
就個人而言,我不知道如何這是「答案」,因爲Vibhore從來沒有問過如何改變其音頻設備設置爲默認值 - 有或沒有用戶交互。 相反,這個問題清楚地問,如何輸出到音頻設備以外的默認音頻設備。例如,在很多遊戲/音頻相關的應用程序中,向用戶呈現包含可用回放設備列表的列表框,他/她可以從中選擇列表框。所選設備是應用程序/遊戲將用於音頻輸出的設備。 –
@Digital_Utopia:好點,現在有希望更好的答案。 –
好得多;) 我在看到您的更新之前添加了我的答案。由於我最終搞清楚了自己,我想我會從我自己的項目中添加一個片段作爲例子。 –