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