使用 NAudio 更改默认音频输出设备

Change default audio output device with NAudio

我想用 NAudio 更改 windows 10 个默认音频输出。

NAudio 有一个 api 来获取默认音频端点:

var enumerator = new MMDeviceEnumerator();
var audioOutputDevice = enumerator.GetDefaultAudioEndpoint(DataFlow.Render, Role.Console);

我想设置默认音频端点。

最后我找不到任何关于 NAudio 的解决方案。我用 PowerShell 来做:

  1. here.

    添加 AudioDeviceCmdlets nuget 包到您的项目
  2. 然后我们应该使用Set-AudioDevice命令来设置默认音频设备。它使用设备 ID 或索引。在 C# 代码中,我们需要一个 PowerShell nuget 包。该包已添加为 AudioDeviceCmdlets nuget 包的依赖项,因此请不要执行任何操作并转到下一步。

  3. 使用此代码设置默认设备:

InitialSessionState iss = InitialSessionState.CreateDefault();
iss.ImportPSModule(new string[]
{
Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "AudioDeviceCmdlets.dll")
});

Runspace runspace = RunspaceFactory.CreateRunspace(iss);
runspace.Open();

Pipeline pipeline = runspace.CreatePipeline();

Command command_set = new Command("Set-AudioDevice");
CommandParameter param_set = new CommandParameter("ID", id);
command_set.Parameters.Add(param_set);
pipeline.Commands.Add(command_set);

// Execute PowerShell script
var results = pipeline.Invoke();

我将此添加为更改音频设备的更简单方法。我查看了您提到的源库 AudioDeviceCmdlets,并且找到了另一种方法。

查看 class AudioDeviceCmdlets you can find this piece of code at line 429,其中 DeviceCollection[i].ID 是新设备的 ID:

 // Create a new audio PolicyConfigClient
 PolicyConfigClient client = new PolicyConfigClient();
 // Using PolicyConfigClient, set the given device as the default playback communication device
 client.SetDefaultEndpoint(DeviceCollection[i].ID, ERole.eCommunications);
 // Using PolicyConfigClient, set the given device as the default playback device
 client.SetDefaultEndpoint(DeviceCollection[i].ID, ERole.eMultimedia);

好吧,就像导入这个库并进行相同的调用一样简单:

 public void SetDefaultMic(string id)
 {
     if (string.IsNullOrEmpty(id)) return;
     CoreAudioApi.PolicyConfigClient client = new CoreAudioApi.PolicyConfigClient();
     client.SetDefaultEndpoint(id, CoreAudioApi.ERole.eCommunications);
     client.SetDefaultEndpoint(id, CoreAudioApi.ERole.eMultimedia);
 }

此外,通过这种方式,当在分离的线程上与 NAudio 结合使用时,您不会得到强制转换异常(添加此注释是因为它发生在我身上)。