Java声音:获取默认麦克风端口

8
使用Java,我正在尝试从默认麦克风录制声音,并显示当前音量和静音状态(按照操作系统设置,不需要检查字节)。到目前为止,我可以使用以下代码获取TargetDataLine并记录它:TargetDataLine line = (TargetDataLine) AudioSystem.getLine(new DataLine.Info(TargetDataLine.class, formato));。在Windows上运行良好,line是使用操作系统选择的默认麦克风。目前,要获取音量/静音控件,我有以下代码:
Mixer.Info[] mixerInfos = AudioSystem.getMixerInfo();

for (Mixer.Info mixerInfo : mixerInfos) {
    Mixer mixer = AudioSystem.getMixer(mixerInfo);

    if (mixer.getMaxLines(Port.Info.MICROPHONE) > 0) {
        System.out.println("-------------");
        System.out.println(mixerInfo);
        Port line = (Port) mixer.getLine(Port.Info.MICROPHONE);
        line.open();


        Line.Info[] targets = mixer.getTargetLineInfo();

        Control[] controls = line.getControls();
        for (Control control : controls) {
            if (control instanceof CompoundControl) {
                Control[] subControls = ((CompoundControl) control).getMemberControls();
                for (Control subControl : subControls) {
                    System.out.println(subControl);
                }
            } else {
                System.out.println(control);
            }
        }
        System.out.println("-----------");
    }
}

我装置中有2个麦克风,但我还没有找到一种方法来知道哪个是默认的(现在是数组中的第二个)。

尝试了Line port = AudioSystem.getLine(Port.Info.MICROPHONE);但它返回的是可用的第一个麦克风(并不是此实例中的默认麦克风)。

那么,有什么方法可以获取与所得到的TargetDataLine相关的默认麦克风端口吗?

谢谢!

1个回答

4
要获取系统中安装的所有麦克风,您可以按如下方式列出它们:

 package testing;

import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Line;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.Mixer;
import javax.sound.sampled.TargetDataLine;

public class Main {
public static void main(String[] args) {
    //Enumerates all available microphones
        Mixer.Info[] mixerInfos = AudioSystem.getMixerInfo();
        for (Mixer.Info info: mixerInfos){
            Mixer m = AudioSystem.getMixer(info);
            Line.Info[] lineInfos = m.getTargetLineInfo();
            if(lineInfos.length>=1 && lineInfos[0].getLineClass().equals(TargetDataLine.class)){//Only prints out info is it is a Microphone
                System.out.println("Line Name: " + info.getName());//The name of the AudioDevice
                System.out.println("Line Description: " + info.getDescription());//The type of audio device
                for (Line.Info lineInfo:lineInfos){
                    System.out.println ("\t"+"---"+lineInfo);
                    Line line;
                    try {
                        line = m.getLine(lineInfo);
                    } catch (LineUnavailableException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                        return;
                    }
                    System.out.println("\t-----"+line);
                }
            }
        }
}
}

从这里开始,你可以识别默认选项... 例如,在我的 MacBook 上,默认选项的名称为 "内置麦克风"


1
请看这里:https://github.com/lkuza2/java-speech-api/wiki/How-to-get-the-level-of-the-TargetDataLine%3F - navy1978
1
对于 Mac,其默认麦克风名称为“内置麦克风”,在其他操作系统中可能会有所不同。我无法在 Windows 上进行测试,但一旦您知道正确的字符串,就可以使用它来查找默认麦克风... - navy1978
2
我认为你把事情搞得比它们本来的复杂,Java默认使用默认麦克风,但是你可以在这里找到更多信息:https://github.com/lkuza2/java-speech-api/wiki/Microphone-Selection - navy1978
2
你可以通过Sound API访问麦克风,但它不会给你一个简单的音量级别。你只需要捕获数据并自行决定音量大小。http://download.oracle.com/javase/tutorial/sound/capturing.html 因此,在开始录制后,你可以立即开始调整音量。 - navy1978
2
一旦你有了这行代码,你可以像这样做:FloatControl volume= (FloatControl) line.getControl(FloatControl.Type.MASTER_GAIN); 如果你真的想要... - navy1978
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接