AS3麦克风录制/保存工作,闪速PCM播放双倍速度

问题描述:

我在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

问题是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

我测试过了。
您需要确保麦克风的频率为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); 
     } 
    }