我正在使用 4 个 USB 声卡(ASUS Xonar U1)。我想向他们每个人发送不同的声音(以不同语言叙述的相同文本)。现在,我为获得我感兴趣的混音器所做的事情是这样的:
Info[] mixerInfo = AudioSystem.getMixerInfo();
int count = 0;
for (Info i : mixerInfo) {
System.out.println("["+(count++)+"]" + i.getName() + " - " + i.getDescription()+" - "+i.getVendor());
}
这给了我如下内容:
[5] Device [plughw:1,0] - Direct Audio Device: USB Advanced Audio Device, USB Audio, USB Audio - ALSA (http://www.alsa-project.org)
[6] Device_1 [plughw:2,0] - Direct Audio Device: USB Advanced Audio Device, USB Audio, USB Audio - ALSA (http://www.alsa-project.org)
[7] Device_2 [plughw:3,0] - Direct Audio Device: USB Advanced Audio Device, USB Audio, USB Audio - ALSA (http://www.alsa-project.org)
现在,在我的配置文件中,我将声卡与 Info[] 索引(“count”变量)相关联。
问题是如果我更改连接声卡的 USB 端口。然后 Info[] 数组有一个全新的顺序,我不知道哪个声卡应该播放语言
en_US
以及哪个 pt_PT
。此外,“plughw:1,0”字符串的变化没有任何明显的模式。如果我只有一张声卡,无论我将它连接到哪个端口,它都将始终为“plughw:1,0”。
如果计算机重新启动,混音器信息 [] 有时也会重新排序。
我还查看了 jUSB,但声卡的设备信息对于所有声卡都完全相同,我不知道如何将它提供的 USB 信息与 Java Sound API 混音器信息进行映射。
那么,有谁知道如何使用 Java Sound API 唯一标识相同的声卡?
或者,是否有人对我可以使用哪种语言/库编写将不同音频文件输出到同一台机器上的 4 个不同 USB 声卡的应用程序有其他建议?
最佳答案
看看 BASS 音频库,它是用 C 编写的。有一个 JNI 库 NativeBass ,它是在 Java 中本地使用它的桥梁。你失去了一些跨平台的能力,但库的性能明显更好,可以很好地处理多个输出,而且我相信在每个音频设备上都有更好的识别。
(安装NativeBass,还需要自己下载BASS,合并两个/lib目录,这里没有完全记录。)
如果我要坚持使用您正在使用的解决方案,我会得到一个便宜的 USB 集线器,将音频 USB 连接到集线器,然后将集线器连接到计算机。这应该每次都以相同的顺序初始化音频,至少给你一个在 JavaSound 中使用的一致顺序。
关于Java Sound API - 区分多个相等的 USB 声卡,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1881729/