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