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

问题描述 投票:1回答:1

我想做一个简单的程序,检查麦克风是否静音。这是我的代码,用于确定哪个 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耳机插入,它被任何应用程序识别。

java audio microphone javasound
1个回答
4
投票

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

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

控制API允许Java Sound API的实现,或者混音器的第三方提供者,通过控制来提供任意种类的信号处理。但如果没有混音器提供你所需要的那种信号处理呢?这将需要更多的工作,但你也许可以在你的程序中实现信号处理。因为Java Sound API让你可以访问作为一个字节数组的音频数据,你可以以任何你选择的方式改变这些字节。

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

IDK如何测试麦克风上的 "静音",但使用输入PCM数据点上的RMS算法测试输入音量是可以做到的。

© www.soinside.com 2019 - 2024. All rights reserved.