为节省带宽和处理资源,运行时将尝试检测何时麦克风不传输声音。在麦克风的活动级别处于静音级别阈值以下一段时间后,运行时将停止传输音频输入并调度
activity
事件。如果使用 Speex 编解码器(在 AIR 1.5 中可用),请将静音级别设置为 0,以确保应用程序能够持续传输音频数据。Speex 语音活动检测将自动减少带宽。
Microphone 类的以下三个属性用于监视和控制活动检测:
-
activityLevel
只读属性指示麦克风检测的音量,范围从 0 到 100。
-
silenceLevel
属性指定激活麦克风并调度
activity
事件所需的音量。
silenceLevel
属性也使用从 0 到 100 的范围,默认值为 10。
-
silenceTimeout
属性描述活动级别必须处于静音级别以下多长时间(以毫秒为单位)后,才会调度
activity
事件。
silenceTimeout
默认值是 2000。
Microphone.silenceLevel
属性和
Microphone.silenceTimeout
属性都是只读的,但可以使用
Microphone.setSilenceLevel()
方法来更改它们的值。
在某些情况下,在检测到新活动时激活麦克风的过程可能会导致短暂的延迟。通过将麦克风始终保持活动状态,可以消除此类激活延迟。应用程序可以调用
Microphone.setSilenceLevel()
方法并将
silenceLevel
参数设置为零。这样可将麦克风保持活动状态并持续收集音频数据,即使未检测到任何声音也是如此。反之,如果将
silenceLevel
参数设置为 100,则可以完全禁止激活麦克风。
以下示例显示了有关麦克风的信息,并报告 Microphone 对象调度的
activity
事件和
status
事件:
var deviceArray = air.Microphone.names;
air.trace("Available sound input devices:");
for (i = 0; i < deviceArray.length; i++)
{
air.trace(" " + deviceArray[i]);
}
var mic = air.Microphone.getMicrophone();
mic.gain = 60;
mic.rate = 11;
mic.setUseEchoSuppression(true);
mic.setLoopBack(true);
mic.setSilenceLevel(5, 1000);
mic.addEventListener(air.ActivityEvent.ACTIVITY, this.onMicActivity);
var micDetails = "Sound input device name: " + mic.name + '\n';
micDetails += "Gain: " + mic.gain + '\n';
micDetails += "Rate: " + mic.rate + " kHz" + '\n';
micDetails += "Muted: " + mic.muted + '\n';
micDetails += "Silence level: " + mic.silenceLevel + '\n';
micDetails += "Silence timeout: " + mic.silenceTimeout + '\n';
micDetails += "Echo suppression: " + mic.useEchoSuppression + '\n';
air.trace(micDetails);
function onMicActivity(event)
{
air.trace("activating=" + event.activating + ", activityLevel=" +
mic.activityLevel);
}
在运行上面的示例时,对着系统麦克风说话或发出噪音,并观察所生成的、显示在控制台中的 trace 语句。