2012-02-21 14 views
3

あまりにも高速再生の方法:録音音声作品、私は次の関数を使用してマイクからの音声入力を記録しています

private function handleSampleData(p_sampleEvent:SampleDataEvent) :void 
    { 
     var data :Number; 
     while (p_sampleEvent.data.bytesAvailable) 
     { 
      data = p_sampleEvent.data.readFloat(); 
      _buffer.writeFloat(data); 
      _buffer.writeFloat(data); 
     } 
    } 

これは動作するようです。

  _buffer.position = 0; 
      _lastRecord = new ByteArray(); 
      while (_buffer.bytesAvailable) 
      { 
       _lastRecord.writeFloat(_buffer.readFloat()); 
      } 
      _lastRecord.position = 0; 

その後、私は新たに作成された音に遊びを()を使用すると、この機能を使用して、それに_lastRecordバッファを養う:

私はレコーディングを終えた後、私はこのような別のバッファに記録されたデータをコピーします
public function handlePlaybackSampleData(p_sampleEvent:SampleDataEvent) :void 
    { 
     // Read data until either MAX_SAMPLES or all available samples are reached. 
     var i:int = 0; 
     var data :Number = 0; 
     while(i < 8192) 
     { 
      if(_lastRecord.bytesAvailable) 
      { 
       data = _lastRecord.readFloat(); 
       p_sampleEvent.data.writeFloat(data); 
       i++; 
       continue; 
      } 
      else 
      { 
       break; 
      } 
     } 
    } 

基本的には機能しますが、再生されるサウンドはあまりにも速いです。 私はこのコードの大部分を、完全にうまく動作する例から取り出しました。私のコードとこれとの重要な違いはもう分かりません:http://labs.makemachine.net/2011/04/record-visualize-save-microphone-input/

まだ、音声が途切れすぎています。 "_buffer.writeFloat(data);"をさらに追加することで、_bufferにさらに多くのデータを入れると、それはより良くなり、その12行があるときは、それが望ましい速度になります。しかし、それだけでも私のマイクにぶつかるときに役立ちます。私が実際に話すなら、それは十分ではないようにも思われます。

これはどうですか?そして、どのように私はそのコードを取った例では、その2行だけで十分ですか?録音中にバッファに書き込む必要のあるデータ量を判断する方法はありますか?

答えて

4

FlashPlayerのマイクのデフォルトのサンプリングレートは、8kHzのモノラルです(使用できない場合は、11.025kHz、22.05kHz、44.1kHz)。オーディオ出力は常に44.1 kHzのステレオです。これは、取得しているサンプルが少なすぎることを意味します:44.1/8〜5.5。

あなたは44.1 kHzに記録サンプルレートを設定することにより、この問題を解決することができます

microphone.rate = 44; // Yes, the API doesn't want the decimals 

あなたはまた、例えば速度を保つことができます録音時に2つの浮動小数点数(2つではなく4つの浮動小数点数)を書き込みます(22 kHzで録音する場合は8、11 kHzで録音する場合は8)。

その他の注意点として、出力サンプルは1つの浮動小数点数ではなく、2つのチャンネルのそれぞれに1つのがあります。したがって、マイクは8192個のモノサンプルを提供します。これは、各サンプルを2回書き込むことによって、両方のチャンネルに適用する必要があります。これで8192の "ステレオ"サンプルが得られました。

しかし、出力を書き込むときは、多くの8192浮動小数点(i)を書きます。これは4096ステレオサンプルに対応しています。もう半分 - 私はあなたのコードとあなたの結果から推測する - は投げ捨てられます。

最終的には、サンプリングサンプルで記録された8192サンプルの前半は、再生サンプラレートよりも約5.5倍低いものです。音が2 * 5.5 = 11倍速すぎるように見えることを意味します。

すべてのサンプルを出力に書き込み、44.1 kHz(または上記のアップサンプル)で記録し、正しい速度で再生する必要があります。

public function handlePlaybackSampleData(p_sampleEvent:SampleDataEvent) :void 
{ 
    // Maximum amount of samples we're allowed to write: 8192 
    // Copying bytes here, rather than floats, so: 
    // 8192 samples * 2 channels * 4 bytes per float = 65536: 
    var bytesToCopy:int = Math.min(_lastRecord.bytesAvailable, 65536); 

    // Using _lastRecord.position since some of it may have been written on the 
    // last call to handlePlaybackSampleData if it had more than 8192 samples: 
    p_sampleEvent.data.writeBytes(
     _lastRecord, 
     _lastRecord.position, 
     bytesToCopy 
    ); 
} 
:サンプルデータを書き込むため

_lastRecord = new ByteArray(); 
_lastRecord.writeBytes(_buffer, 0, _buffer.bytesAvailable); 

同じ: - 追記オン

event.data.writeBytesはバッファ(実際にチェックしていない仮定)をコピーするため たくさん速くなる可能性があります
+0

そうだった。マイクのレート設定が合っていませんでした。ありがとう、残りのためにも! – TheSHEEEP

関連する問題