2

SecurityPanel.MICROPHONE を使用せずに AS3 でアクティブなマイクを変更する方法はありますか? ボタンのクリックによってトリガーされた場合でも、私の試みはすべて、すべてのマイクのアクティビティを停止します。

私が行った場合:

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

マイクのアクティビティ、レベル、および SampleEvents をリッスンして取得できます。すべてうまくいきます。

後で私が行う場合:

mic = Microphone.getMicrophone(newIndex);

mic.activityLevel で -1 を取得し始め、SampleEvents を受信しませんが、新しいマイクの適切な名前を取得できます

mic.name;

簡単にするために、 index と newIndex は両方ともテスト済みの作業ソースであり、最初のマイク要求で渡された場合はどちらも機能すると仮定します。

これはセキュリティ上のリスクと見なされ、許可されていませんか? 1 つのマイクを初期化すると、それで問題が発生することはありますか? 空中でカメラを切り替えましたが、それは空中でした。

*補足として、コンピューターがスピーカーに接続されている場合、osx 上の FireFox からアクセスするとフィードバックが発生する可能性があるため、SecurityPanel を使用してこれを行うことはできません。ウィンドウを開く前にすべてのサウンド出力を 0 に落としてみましたが、SecurityPanel.MICROPHONE がアクティブになるとすぐにレベルが元に戻ります。残念ながら、ユーザーにスピーカーの音量を下げるように求めることはできません。

4

1 に答える 1

3

私の経験から、 activityLevel が -1 を報告する理由は 2 つあります。

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. 2 番目の理由は、より難解なようで、2 つのことに関連しています。マイクがループバック モードになったかどうか。マイクに *SampleDataEvent.SAMPLE_DATA* リスナーがある場合。

その背後にあるロジックを正確に説明することはできませんが、マイクをループバック モードに送信すると、いくつかのイベント ロジックが初期化されると思います。mic.setLoopBack(true);を実行することもできます。mic.setLoopBack(false); .

バックグラウンドで実際に何が起こっているのかを誰かが説明してくれたらいいのにと思います。

3.パネルが開いたときの巨大なエコーに関連する2番目の問題について、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

于 2012-08-09T17:44:55.840 に答える