2011-02-09 10 views
3

マイクのストリームを取り込んでリアルタイムエフェクトを適用し、これをスピーカーに出力するフラッシュアプ​​リケーションを作成しようとしています。私はマイクからの出力を取り出す際に、吃音に問題があるのByteArrayにこれをコピーAMDその後、別々のFlash 10.1 AS3 - マイクにリアルタイムエフェクトを適用する - スタッターの問題

サウンド=新しいサウンドを使用しています見つけることだ

();

sound.addEventListener(SampleDataEvent.SAMPLE_DATA、processSound);

sound.play();

このByteArrayから読み込み、サウンドを再生する。

私は、マイクのbytesAvailableからの入力が変化し、2つのイベント(マイクのSAMPLE_DATAとサウンドのSAMPLE_DATA)が発音していないことに気付きました。A B A B A B B likeが必要ですがランダムです。

mic.SAMPLE_DATAイベントがさまざまなデータ量で異なる間隔で発生し、実際の実装では使用可能なデータを読み込み、入力をバッファしてSound SampleDataEventが常に詰め物を避けるために再生?

答えて

4

解決策が見つかったので、他の誰かが同様の問題を抱えていた(多くのGoogle検索では私のために何も表示されませんでした)。

マイクからの入力が矛盾して供給され、適切に処理するために送信されるすべてのバイトが必要なようです。それを動作させるための鍵は、配列を使用して入力をバッファすることでした。

private var mic:Microphone; 
private var micBuffer:Array; 
private var playBackSound:Sound; 
//the effect I was applying needed to be applied to 
private var _leftChannel:Vector.<Number> = new Vector.<Number>(8192/2); 

private function init() { 
    micBuffer = new Array(); 
    mic = Microphone.getMicrophone(); 
    mic.rate = 22; 
    mic.addEventListener(SampleDataEvent.SAMPLE_DATA, micSampleData); 
} 

private function micSampleData(e:SampleDataEvent) { 

    //store everything sent from the microphone into the array - this will vary in length 
    while (e.data.bytesAvailable > 0) micBuffer.push(e.data.readFloat()); 

    //can wait here for the array to reach a certain size if needed 
    if (!playBackSound) { 
     playBackSound = new Sound(); 
     playBackSound.addEventListener(SampleDataEvent.SAMPLE_DATA, processSound); 
     playBackSound.play(); 
    } 
} 

private function playBackSoundSampleData(e:SampleDataEvent) { 

    //this number will change depending on the sample rate of microphone 
    var numberOfFloats = 8192/8; 
    for (var i = 0; i<numberOfFloats && micBuffer.length > 0; i++) 
    { 
     _leftChannel[i] = micBuffer.shift(); 
     count++; 
    } 

    //apply effect 

    //sample rate here is half of 44 so write twice + twice again to make stereo 
    for(var i = 0 ; i < count ; ++i) 
    { 
     e.data.writeFloat(_leftChannel[i]); 
     e.data.writeFloat(_leftChannel[i]); 
     e.data.writeFloat(_leftChannel[i]); 
     e.data.writeFloat(_leftChannel[i]); 
    } 
} 
+0

マイクから取り出したサウンドを操作するために使用したエフェクトライブラリはありますか? – Eran

+0

最後に適用する必要があった唯一の効果はピッチシフトでした。これを行うにはhttp://iq12.com/blog/2009/08/25/real-time-pitch-shifting/を使用しました – Tom

+0

欠点がありますこのalgorythm。再生を停止させるのは非常に簡単で、micBufferは無限大になります。数秒間アプリウィンドウのサイズを変更するだけです!またはAndroid搭載端末にインストールしてしばらくお待ちください。 – Seba