2012-06-15 31 views
2

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

如果我做的:

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

我可以听,让麦克风活性,水平和SampleEvents。一切运作良好。

如果在以后我做的:

mic = Microphone.getMicrophone(newIndex); 

我开始越来越-1 mic.activityLevel并没有收到SampleEvents,但我可以得到新的MIC进行正确的名称

mic.name; 

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

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

*作为一个备注,我不能使用SecurityPanel来做到这一点,因为如果计算机连接到扬声器,从osx上的FireFox访问时可能会有反馈。我曾尝试在打开窗口之前将所有声音输出设置为0,但只要SecurityPanel.MICROPHONE处于活动状态,级别就会恢复。不幸的是,只是要求用户关闭扬声器,这不是一种选择。

+0

您**可以在用户已经授予访问权限后切换麦克风。你有没有机会使用增强型麦克风?使用增强麦克风时,使用多个话筒可能会遇到困难。 –

+3

只是一个愚蠢的问题,你做'mic = Microphone.getMicrophone(newIndex);'后添加新的事件监听器? – bmleite

+0

Sunil D. - 在有人授予访问权限后,我遇到此问题,但未使用增强麦克风。 – smilinfoo

回答

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的soundtransform对象。这样,您可以将麦克风保持在环回模式,但可以防止巨大的回声和反馈,以及从输出中移除麦克风捕获的声音。

下面是参考线: 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