2011-06-21 29 views
1

根據我的研究,Java的聲音api不能很好地與OsX搭配使用。它很難確定有效輸入,因此它通常默認爲第一個系統輸入。如何使用javax.sound.sampled。*列出所有可用(輸入)端口?

我的解決方案是遍歷一個輸入端口陣列,記錄幾毫秒的音頻並比較這些片段。無論哪一個振幅最大,我都會用作我的輸入。

我的問題是,什麼是最好的方法來生成一個可用於Java的所有輸入端口的數組?

+0

有關顯示可用行的示例,請參閱[MediaTypes source](http://stackoverflow.com/questions/5304001/javasound-mixer-with-both-ports-and-datalines/5337619#5337619)。這可能會給你一些關於如何深入研究的想法。 –

回答

3

可以使用列出所有可用攪拌機以下對象:

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用作參數。如何確定哪些資源可用

+0

這些是混音器,而不是實際的端口。 – tylerdavis

+0

每個混音器都有一組相關的行,您可以使用getTargetLineInfo()或getSourceLineInfo()方法訪問它們。因此,您可以通過名稱爲「內置麥克風」的調音臺訪問麥克風線路(或端口)。 –

相關問題