gpt4 book ai didi

c# - 在 C# 中使用 'DefaultAudioEndpoint' 以外的音频端点

转载 作者:太空宇宙 更新时间:2023-11-03 14:47:31 28 4
gpt4 key购买 nike

This program是用于收听 Windows 默认音频设备的 rgb 键盘的音频可视化工具。我的音频设置有点复杂,我使用的不仅仅是默认音频设备。例如,当我从 Winamp 播放音乐时,它会通过设备 Auxillary 1 (Synchronous Audio Router) 而不是 Desktop Input (Synchronous Audio Router) 我已将其设置为默认值。我希望能够更改程序监听的设备以进行可视化。

我在声明音频设备的源中找到了; CSCoreAudioInput.cs 中的第 32-36 行:

public void Initialize()
{
MMDevice captureDevice = MMDeviceEnumerator.DefaultAudioEndpoint(DataFlow.Render, Role.Console);
WaveFormat deviceFormat = captureDevice.DeviceFormat;
_audioEndpointVolume = AudioEndpointVolume.FromDevice(captureDevice);
}

我从 documentation 中理解的方式,MMDeviceEnumerator.DefaultAudioEndpoint(DataFlow.Render, Role.Console) 部分是 Windows 为应用程序提供我的默认 IMMEndpoint“桌面输入”的位置。

我将如何更改 DefaultAudioEndpoint

Further Reading展示了几种获取 IMMDevice 的方法,DefaultAudioEnpoint 就是其中之一。在我看来,我必须枚举设备,然后使用 PKEY_Device_FriendlyName 分离出 Auxillary 1(同步音频路由器)。这对我来说有点多,因为我几乎没有 C# 经验。有没有更简单的方法来选择不同的端点?我在正确的轨道上吗?还是我完全错过了标记?

另外,MMDeviceIMMDevice 有什么区别?源似乎只使用 MMDevice 而所有 Microsoft 文档都引用 IMMDevice

谢谢。

最佳答案

我做到了!

我找到了为什么程序使用 MMDevice 而不是 IMMDevice 的原因。开发人员已选择使用 CSCore库而不是 Windows 自己的核心音频 API。

来自 CSCore MMDeviceEnumerator Documentation 的继续阅读,看起来我必须制作一个单独的程序来输出所有端点及其各自的端点 ID 字符串。然后我可以用 GetDevice(String id) 方法替换 DefaultAudioEndpoint 方法,其中 String id 是我从单独的程序。

为了找到我想要的端点,我编写了这个简短的程序来找到我想要的所有信息:

static void Main(string[] args)
{
MMDeviceEnumerator enumerator = new MMDeviceEnumerator();
MMDeviceCollection collection = enumerator.EnumAudioEndpoints(DataFlow.Render,DeviceState.Active);
Console.WriteLine($"\nNumber of active Devices: {collection.GetCount()}");

int i = 0;
foreach (MMDevice device in collection){

Console.WriteLine($"\n{i} Friendly name: {device.FriendlyName}");
Console.WriteLine($"Endpoint ID: {device.DeviceID}");
i++;
}
Console.ReadKey();
}

这向我表明我想要的端点是列表中的项目编号 3(数组中的 2),而不是使用 GetDevice(String id) 我使用了 ItemAt(int deviceIndex )

MMDeviceEnumerator enumerator = new MMDeviceEnumerator();
MMDeviceCollection collection = enumerator.EnumAudioEndpoints(DataFlow.Render,DeviceState.Active);
MMDevice captureDevice = collection.ItemAt(2);

但是在这种情况下,程序没有使用 captureDevice 来引入音频数据。这些是神奇的线条:

_capture = new WasapiLoopbackCapture(100, new WaveFormat(deviceFormat.SampleRate, deviceFormat.BitsPerSample, i));
_capture.Initialize();

我发现 WasapiLoopbackCapture 除非更改,否则使用 Windows 的默认设备,并且代码使用 DefaultAudioEndpoint 获取默认设备的属性。所以我加了

_capture.Device = captureDevice;
//before
_capture.Initialize();

现在程序可以正确地从我的非默认音频端点提取音频数据。

关于c# - 在 C# 中使用 'DefaultAudioEndpoint' 以外的音频端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53534186/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com