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

Spa*_*323 2 java audio microphone javasound

我正在尝试制作一个简单的程序来检查麦克风是否静音。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;
}
Run Code Online (Sandbox Code Playgroud)

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

BooleanControl muteControl = (BooleanControl)mic.getControl(BooleanControl.Type.MUTE);
System.out.println(muteControl.getValue());
Run Code Online (Sandbox Code Playgroud)

但是,我收到错误:

Unsupported control type: Mute
Run Code Online (Sandbox Code Playgroud)

我继续查看Controls可以使用Line以下内容:

for(Control c : mic.getControls()){
    System.out.println(c.getType());
}    
Run Code Online (Sandbox Code Playgroud)

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

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

Phi*_*ner 6

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

来自使用控件处理音频(最后一节直接操作音频数据):

Control API 允许 Java Sound API 的实现或混音器的第三方提供商通过控件提供任意类型的信号处理。但是,如果没有混音器提供您需要的信号处理类型怎么办?这将需要更多的工作,但您也许能够在程序中实现信号处理。由于 Java Sound API 允许您以字节数组的形式访问音频数据,因此您可以以您选择的任何方式更改这些字节。

因此,我倾向于避免使用控制线,并在可能的情况下编写代码来完成所需的功能。例如,可以手动访问 aSourceDataLine或的各个帧TargetDataLine

我不知道如何测试麦克风上的“静音”,但可以在传入 PCM 数据点上使用 RMS 算法来测试传入音量。