2012-06-15 30 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