根据我的经验,有两个原因可能导致 activityLevel 报告 -1 :
1.用户未接受安全权限
这可以通过StatusEvent.STATUS检测到并检查 mic.muted 属性。
mic.addEventListener(StatusEvent.STATUS, onMicrophoneStatus, false, 0, true);
private function onMicrophoneStatus(event:StatusEvent):void
{
if (event.code == "Microphone.Unmuted")
trace("Microphone access was allowed.");
else if (event.code == "Microphone.Muted")
trace("Microphone access was denied.");
}
2.第二个原因似乎更深奥,与两件事有关。麦克风是否进入环回模式;如果麦克风有 *SampleDataEvent.SAMPLE_DATA* 监听器。
我无法真正准确地解释其背后的逻辑,但我想将麦克风发送到环回模式会初始化一些事件逻辑。你甚至可以做mic.setLoopBack(true); mic.setLoopBack(false); .
我希望有人可以解释背景中实际发生的事情。
3.关于面板打开时出现巨大回声的第二个问题,rockabit找到了一个很好的技巧来解决这个问题。您必须将麦克风的 SoundTransform 属性设置为音量为 0 的声音转换对象。这允许您将麦克风保持在环回模式但防止巨大的回声和反馈以及从输出中删除麦克风捕获的声音。
这是供参考的线程:
http ://www.rockabit.com/2009/01/14/microphone-activitylevel-in-flash/
最后,这是我用来初始化麦克风的一段代码,即使在交换麦克风时也能正常工作:(为清楚起见,剪掉了)
private function initializeMicrophone(micIndex:int = 0):void
{
trace("Initialize mic: "+micIndex);
var gain:int = 70;
var rate:int = 44;
var silence:int = 0;
var timeout:int = 100;
this.microphone = Microphone.getEnhancedMicrophone(micIndex);
mic.addEventListener(StatusEvent.STATUS, onMicrophoneStatus, false, 0, true);
mic.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData);
mic.gain = gain;
mic.setSilenceLevel(silence, timeout);
mic.rate = rate;
var micXform:SoundTransform = new SoundTransform(0);
mic.soundTransform = micXform;
mic.codec = SoundCodec.NELLYMOSER;
mic.setUseEchoSuppression(true);
mic.setLoopBack(true);
var micOptions:MicrophoneEnhancedOptions = new MicrophoneEnhancedOptions();
micOptions.mode = MicrophoneEnhancedMode.FULL_DUPLEX;
micOptions.nonLinearProcessing = true;
micOptions.echoPath = 128;
mic.enhancedOptions = micOptions;
}
private function onSwapMicrophone():void
{
if(this.mic.index == 0)
initializeMicrophone(1);
else
initializeMicrophone(0);
}
希望这可以帮助!
-b