私の経験から、 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