根据我的研究,Java的声音api与OsX不相称。确定活动输入很困难,因此通常默认为第一个系统输入。
我的解决方案是遍历一系列输入端口,记录几毫秒的音频并比较这些部分。无论哪个幅度最大,我都会用作我的输入。
我的问题是,生成Java可用的所有输入端口数组的最佳方法是什么?
答案 0 :(得分:3)
您可以使用以下方法列出所有可用的混音器对象:
Mixer.Info[] mixers = AudioSystem.getMixerInfo();
for (Mixer.Info mixerInfo : mixers){
System.out.println(mixerInfo);
}
在我的系统上,Mac,这就是结果:
Java Sound Audio Engine,版本1.0
内置输入,版本未知版本
内置麦克风,版本未知版本
修改强>
以下是如何提取可以从中获取音频输入的有效目标行列表:
Mixer.Info[] mixers = AudioSystem.getMixerInfo();
List<Line.Info> availableLines = new ArrayList<Line.Info>();
for (Mixer.Info mixerInfo : mixers){
System.out.println("Found Mixer: " + mixerInfo);
Mixer m = AudioSystem.getMixer(mixerInfo);
Line.Info[] lines = m.getTargetLineInfo();
for (Line.Info li : lines){
System.out.println("Found target line: " + li);
try {
m.open();
availableLines.add(li);
} catch (LineUnavailableException e){
System.out.println("Line unavailable.");
}
}
}
System.out.println("Available lines: " + availableLines);
获得Line.Info对象后,可以通过调用AudioSystem.getLine()并使用该Line.Info作为参数来获取与Line.Info对象关联的TargetDataLine。
答案 1 :(得分:0)
有关如何确定可用资源的基础知识,请访问: Accessing Audio System Resources
我发现这部分在Java声音教程中对示例代码最有帮助: http://download.oracle.com/javase/tutorial/sound/converters.html