4

AS3には、AMFを介して.wavファイルをサーバーに保存するために正常に使用できるマイク録音スクリプトがあります。これらのファイルは、どのオーディオプレーヤーでも問題なく再生され、奇妙な影響はありません。

参考までに、マイクのByteArrayをキャプチャするために私が行っていることは次のとおりです:( AudioRecorderと呼ばれるクラス内で)

public function startRecording():void {
_rawData = new ByteArray();
_microphone
 .addEventListener(SampleDataEvent.SAMPLE_DATA,_samplesCaptured, false, 0, true);
}

private function _samplesCaptured(e:SampleDataEvent):void {
  _rawData.writeBytes(e.data);
}

これは問題なく動作します。記録が完了したら、_rawData変数を取得して、WavWriterクラスなどで実行できます。

ただし、これと同じByteArrayを、adobeクックブックから採用した次のコードを使用してサウンドとして実行すると、(WavPlayerというクラス内で)

public function playSound(data:ByteArray):void {
  _wavData = data;
  _wavData.position = 0;
  _sound.addEventListener(SampleDataEvent.SAMPLE_DATA, _playSoundHandler);
  _channel = _sound.play();
  _channel
    .addEventListener(Event.SOUND_COMPLETE, _onPlaybackComplete, false, 0, true);
}

private function _playSoundHandler(e:SampleDataEvent):void {
  if(_wavData.bytesAvailable <= 0) return;
  for(var i:int = 0; i < 8192; i++) {
    var sample:Number = 0;
    if(_wavData.bytesAvailable > 0) sample = _wavData.readFloat();
    e.data.writeFloat(sample);
  }
}

オーディオファイルは2倍の速度で再生されます!記録ビットレートなどを確認し、それらがすべて正しいことを確認し、バッファサイズやその他の考えられる数値を変更してみました。それはモノラル対ステレオのものでしょうか?

私がここで十分に明確であったことを願っています、ありがとう!

4

2 に答える 2

8

問題は、ByteArrayに両方のチャネル(左と右)のデータが含まれている必要があり、一方の値が次々に含まれていることです。したがって、録音がモノラルの場合、コードは次のようになります。

for(var i:int = 0; i < 8192; i++) {
    var sample:Number = 0;
    if(_wavData.bytesAvailable > 0) sample = _wavData.readFloat();
        e.data.writeFloat(sample);
        e.data.writeFloat(sample);
}

ステレオの場合は、それに応じて調整する必要があります。

于 2010-04-29T01:08:38.467 に答える
3

私はそれをテストしました。
マイクのレートが44kHzであることを確認する必要があります
。_microphone.rate=44;
これは正しく聞こえるはずです。

私が使用した:

    private function playSound(data:ByteArray):void
    {
        rawData = data;
        rawData.position = 0;
        var sound:Sound = new Sound();
        sound.addEventListener(SampleDataEvent.SAMPLE_DATA, playSoundHandler);
        var channel:SoundChannel = sound.play();
        channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete, false, 0, true);
    }

    private function playSoundHandler(e:SampleDataEvent):void
    {
        if(rawData.bytesAvailable <= 0)
        {
            return;
        }
        for(var i:int = 0; i < 8192; i++)
        {
            var sample:Number = 0;
            if(rawData.bytesAvailable > 0)
            {
                sample = rawData.readFloat();
            }
            e.data.writeFloat(sample);
            e.data.writeFloat(sample);
        }
    }
于 2011-01-24T18:27:57.320 に答える