如何在directshow中选择音频输出设备

时间:2012-06-18 11:30:31

标签: audio directshow directshow.net

我想知道如何在directshow中为音频选择输出设备。我能够在directshow中获得可用的音频输出设备。但是我怎样才能使其中一个成为音频输出设备。它始终用于默认音频设备。我希望能够在我选择的设备上输出音频。我一直在谷歌苦苦挣扎,但找不到任何有用的东西。我所能获得的只是this链接,但它并没有真正解决我的问题。

任何帮助对我都有帮助。

2 个答案:

答案 0 :(得分:3)

用户可以管理音频设备并选择主设备(例如通过控制面板小程序)。您可以通过设计找到switch devices programmatically in Windows XP的方法,但是在Vista + it is impossible without interactive user action中。

另见Larry的回答:How to change default sound playback device programatically?

UPD。上面提到的是修改试图改变默认音频输出设备的系统配置。但是,应用程序不仅限于默认设备。相反,它可以枚举可用设备(请参阅Using the System Device Enumerator + CLSID_AudioRendererCategory),然后使用BindToObject调用为特定设备创建渲染器实例。从那以后,它是一个常规过滤器,只是内部绑定到感兴趣的设备。

答案 1 :(得分: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();
}