- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
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#
经验。有没有更简单的方法来选择不同的端点?我在正确的轨道上吗?还是我完全错过了标记?
另外,MMDevice
和 IMMDevice
有什么区别?源似乎只使用 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/
This program是用于收听 Windows 默认音频设备的 rgb 键盘的音频可视化工具。我的音频设置有点复杂,我使用的不仅仅是默认音频设备。例如,当我从 Winamp 播放音乐时,它会通过设
我是一名优秀的程序员,十分优秀!