Java 检查麦克风输入是否静音

Java check if microphone input is muted

我正在尝试制作一个简单的程序来检查麦克风是否静音。这是我用来确定 Line 麦克风的代码。

private Line getMic() throws LineUnavailableException {

    Mixer.Info[] mixerInfos = AudioSystem.getMixerInfo();

    for (int i = 0; i < mixerInfos.length; i++) {
        Mixer mixer = AudioSystem.getMixer(mixerInfos[i]);
        int maxLines = mixer.getMaxLines(Port.Info.MICROPHONE);
        Port lineIn = null;
        if (maxLines > 0) {

            lineIn = (Port) mixer.getLine(Port.Info.MICROPHONE);
            return lineIn;
        }
    }

    return null;
}

然后我从那里调用以下内容:

BooleanControl muteControl = (BooleanControl)mic.getControl(BooleanControl.Type.MUTE);
System.out.println(muteControl.getValue());

但是,我收到一个错误:

Unsupported control type: Mute

我继续使用以下方法查看 Controls 可用于 Line 的内容:

for(Control c : mic.getControls()){
    System.out.println(c.getType());
}    

只有一个Control,就是Master Volume。我不确定为什么没有列出 Mute 控件。

在我的 getMic() 函数中返回的行正在返回正确的麦克风。我插入了一个 USB 耳机,它可以被任何应用程序识别。

不保证各种音频控制线都能实现。我不确定为什么,但我认为这与 OS 和本地音频软件有关,它们可能会有很大差异。

来自Processing Audio with Controls(最后一节直接操作音频数据):

The Control API allows an implementation of the Java Sound API, or a third-party provider of a mixer, to supply arbitrary sorts of signal processing through controls. But what if no mixer offers the kind of signal processing you need? It will take more work, but you might be able to implement the signal processing in your program. Because the Java Sound API gives you access to the audio data as an array of bytes, you can alter these bytes in any way you choose.

出于这个原因,我倾向于避免使用控制线,并在可能的情况下编写代码来完成所需的功能。例如,可以手动访问 SourceDataLineTargetDataLine.

的各个帧

IDK 如何在麦克风上测试 "mute",但可以在传入的 PCM 数据点上使用 RMS 算法测试传入音量。