如何使用javax.sound.sampled列出所有可用(输入)端口。*?

时间:2011-06-21 18:06:27

标签: java audio

根据我的研究,Java的声音api与OsX不相称。确定活动输入很困难,因此通常默认为第一个系统输入。

我的解决方案是遍历一系列输入端口,记录几毫秒的音频并比较这些部分。无论哪个幅度最大,我都会用作我的输入。

我的问题是,生成Java可用的所有输入端口数组的最佳方法是什么?

2 个答案:

答案 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