2010-04-29 29 views
4

我在AS3中有一個可用的麥克錄製腳本,我已經能夠成功地使用AMF將.wav文件保存到服務器。這些文件在沒有奇怪效果的任何音頻播放器中播放都很好。AS3麥克風錄製/保存工作,閃速PCM播放雙倍速度

僅供參考,下面是我在做什麼來捕捉麥克風的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作爲聲音:一個叫做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); 
    } 
} 

音頻文件以雙倍速播放!我檢查了記錄比特率等,我非常肯定這些都是正確的,我試着改變緩衝區大小和其他我能想到的數字。它可能是單聲道還是立體聲?

希望我在這裏已經夠清楚了,謝謝!

+0

你應該堅持 「動作-3」 標記爲AS3的問題。這是常用的。 – ktdrv 2010-04-29 01:10:22

回答

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); 
} 

如果是立體聲,則需要進行相應的調整。

+0

所以這是一個立體聲/單聲道的東西!我沒有想過寫兩次,謝謝! – Lowgain 2010-04-29 01:10:17

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); 
     } 
    }