根據我的研究,Java的聲音api不能很好地與OsX搭配使用。它很難確定有效輸入,因此它通常默認爲第一個系統輸入。如何使用javax.sound.sampled。*列出所有可用(輸入)端口?
我的解決方案是遍歷一個輸入端口陣列,記錄幾毫秒的音頻並比較這些片段。無論哪一個振幅最大,我都會用作我的輸入。
我的問題是,什麼是最好的方法來生成一個可用於Java的所有輸入端口的數組?
根據我的研究,Java的聲音api不能很好地與OsX搭配使用。它很難確定有效輸入,因此它通常默認爲第一個系統輸入。如何使用javax.sound.sampled。*列出所有可用(輸入)端口?
我的解決方案是遍歷一個輸入端口陣列,記錄幾毫秒的音頻並比較這些片段。無論哪一個振幅最大,我都會用作我的輸入。
我的問題是,什麼是最好的方法來生成一個可用於Java的所有輸入端口的數組?
可以使用列出所有可用攪拌機以下對象:
Mixer.Info[] mixers = AudioSystem.getMixerInfo();
for (Mixer.Info mixerInfo : mixers){
System.out.println(mixerInfo);
}
在我的系統,一臺Mac,這是結果:
Java聲音音頻引擎,1.0版
內置輸入版本未知版本
內置麥克風版本未知版本
Ed它
這裏如何提取有效的目標線,你可以從中獲取音頻輸入列表:
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對象,你可以得到與行相關聯的TargetDataLine的。 Info對象通過調用AudioSystem.getLine()並將該Line.Info用作參數。如何確定哪些資源可用
這些是混音器,而不是實際的端口。 – tylerdavis
每個混音器都有一組相關的行,您可以使用getTargetLineInfo()或getSourceLineInfo()方法訪問它們。因此,您可以通過名稱爲「內置麥克風」的調音臺訪問麥克風線路(或端口)。 –
基礎知識可以在這裏找到: Accessing Audio System Resources
我發現這部分是在示例代碼方面最有幫助的,在Java聲音教程: http://download.oracle.com/javase/tutorial/sound/converters.html
有關顯示可用行的示例,請參閱[MediaTypes source](http://stackoverflow.com/questions/5304001/javasound-mixer-with-both-ports-and-datalines/5337619#5337619)。這可能會給你一些關於如何深入研究的想法。 –