【问题标题】:How can I select an audio output device in directshow如何在 directshow 中选择音频输出设备
【发布时间】:2012-06-18 11:30:31
【问题描述】:

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

任何帮助都会对我很有帮助。

【问题讨论】:

    标签: audio directshow directshow.net


    【解决方案1】:

    首先,如果您不使用 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();
    }
    

    【讨论】:

    • 顺便说一句,这段代码 sn-p 的弱点是RenderFile 调用。是的,它经常找到预添加的渲染器,并且总是在这个简单的示例中,但是直接连接引脚更可靠。也就是说,当渲染器的引脚被显式连接时。
    【解决方案2】:

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

    在这里也可以看到拉里的回答:How to change default sound playback device programmatically?

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

    【讨论】:

    • 就我个人而言,我不明白这是“答案”,因为 Vibhore 从未询问过如何更改默认设置的音频设备 - 无论是否有用户交互。相反,问题清楚地问,如何输出到默认设备以外的音频设备。例如,在许多游戏/音频相关的应用程序中,用户会看到一个包含可用播放设备列表的列表框,他/她可以从中进行选择。所选设备是应用程序/游戏将用于音频输出的设备。
    • @Digital_Utopia:好点子,现在希望得到更好的答案。
    • 好多了;)我在看到您的更新之前添加了我的答案。由于我最终自己解决了这个问题,所以我想我应该从我自己的项目中添加一个 sn-p 作为示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    相关资源
    最近更新 更多