【问题标题】:Send audio output to all speaker devices将音频输出发送到所有扬声器设备
【发布时间】:2011-04-01 22:35:45
【问题描述】:

我需要能够将我的应用程序的声音输出定向到系统的所有音频输出 - 特别是笔记本电脑的内置扬声器和耳机。我在 Windows Vista/7 和最新版本的 .NET Framework 上使用 C#,并且不需要支持较旧的(即 Windows XP)操作系统。

我能够成功地使用Core Audio API 更改活动扬声器的音量,并且能够枚举并专门操作各个音频设备,但无法实际更改设备的状态以启用它们。

private MMDeviceEnumerator devEnum = new MMDeviceEnumerator();
private MMDeviceCollection audioDevices = null;

public Form1()
{
    InitializeComponent();
    this.defaultDevice = this.devEnum.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia);
    AudioEndpointVolumeNotificationDelegate(AudioEndpointVolume_OnVolumeNotification);
    this.audioDevices = this.devEnum.EnumerateAudioEndPoints(EDataFlow.eRender, EDeviceState.DEVICE_STATEMASK_ALL);
    for (int i = 1; i < this.audioDevices.Count; i++)
    {
        // Doesn't work - throws exception because property is read-only:
        // this.audioDevices[i].State = EDeviceState.DEVICE_STATE_ACTIVE 
    }
}

基本上,我正在寻找一种启用音频设备的方法,而不仅仅是调整它们的音量。有人知道这样做的方法吗?我一直在查看IMMDevice Interface 的 MSDN 文档,但发现它很困难,因为它不是作为托管代码提供的,而且我使用的 .NET 包装器没有完全实现它。我也愿意接受采用完全不同方法的建议,只要我仍然可以使用 C# 来做到这一点。谢谢!

【问题讨论】:

  • 即使您可以启用不同的设备,例如蓝牙耳机和内置扬声器,插入耳机时您也不太可能通过扬声器播放声音——这通常是纯电动的-- 机械插入耳机插孔将音频路由到插入的设备而不是扬声器。就计算机而言,它就是一台设备。
  • 在不知道您使用什么 API 来呈现音频的情况下,很难知道如何回答这个问题。

标签: c# .net windows-7 audio core-audio


【解决方案1】:

如果您确保在 Windows 声音控制面板中启用了您想要发出声音的设备,那么它们都将显示为 DEVICE_STATE_ACTIVE。如果您想发送相同的音频文件以同时在多个设备上播放,您应该能够使用 Core Audio API 做到这一点。但是,如果您想控制其他应用程序以强制它们播放所有这些输出,则必须重写它们的代码;P 您可以制作一个低级驱动程序来拦截所有发出的声音,然后将其重定向到您的所有设备想。 http://ac3filter.net/ 之类的东西(虽然我认为 ac3Filter 仅在应用程序使用 DirectShow 时才有效)

【讨论】:

  • ac3filter 不会“拦截所有发出的声音”,它只是输出多声道音频流。如果您有多声道声卡,您会在所有扬声器中听到“某些声音”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-06
  • 2011-07-22
  • 2012-12-14
相关资源
最近更新 更多