我想做一个简单的程序,检查麦克风是否静音。这是我的代码,用于确定哪个 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耳机插入,它被任何应用程序识别。
各种音频控制线都不能保证实现。我不知道为什么,但我认为这与操作系统和本地音频软件有关,它们的差异可能很大。
从 用控件处理音频 (最后一节 直接操作音频数据):
控制API允许Java Sound API的实现,或者混音器的第三方提供者,通过控制来提供任意种类的信号处理。但如果没有混音器提供你所需要的那种信号处理呢?这将需要更多的工作,但你也许可以在你的程序中实现信号处理。因为Java Sound API让你可以访问作为一个字节数组的音频数据,你可以以任何你选择的方式改变这些字节。
出于这个原因,我倾向于避免使用控制线,在可能的情况下,编写代码来完成所需的功能。例如,人们可以手动访问单个帧的 SourceDataLine
或 TargetDataLine
.
IDK如何测试麦克风上的 "静音",但使用输入PCM数据点上的RMS算法测试输入音量是可以做到的。