在AS3中更改活动麦克风

时间:2012-06-15 19:50:54

标签: actionscript-3 flash microphone

有没有办法在不使用SecurityPanel.MICROPHONE的情况下更改AS3中的活动麦克风?我的所有尝试都会停止所有麦克风活动,即使是通过点击按钮触发也是如此。

如果我这样做:

var mic:Microphone = Microphone.getMicrophone(index);

我可以听,并获得麦克风活动,级别和SampleEvents。一切顺利。

如果稍后我会这样做:

mic = Microphone.getMicrophone(newIndex);

我开始为mic.activityLevel获得-1并且没有收到SampleEvents,但我可以使用

获取新麦克风的正确名称
mic.name;

为简单起见,假设index和newIndex都是已经过测试的工作源,并且如果传入了初始麦克风请求,则可以正常工作。

这是否被视为安全风险且不被允许?一旦你初始化一个麦克风,那就是你坚持的那个?我在空中换了相机,但那是空气。

*作为附注,我不能使用SecurityPanel这样做,因为如果计算机连接到扬声器,从osx上的FireFox访问时可能会有反馈。我打算在打开窗口之前将所有声音输出都降为0,但只要SecurityPanel.MICROPHONE处于活动状态,该级别就会恢复。不幸的是,只是要求用户拒绝他们的扬声器,不是一种选择。

1 个答案:

答案 0 :(得分:3)

根据我的经验,有两个原因导致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(假);

我希望有人能解释后台实际发生的事情。

3.对于第二个与面板打开时巨大回声相关的问题,rockabit找到了解决这个问题的好方法。您必须将麦克风的SoundTransform属性设置为音量为0的音频变换对象。这样可以让您将麦克风保持在环回模式,但可以防止巨大的回声和反馈以及从输出中删除麦克风捕获的声音。 / p>

以下是供参考的帖子: 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