2010-04-29 4 views
4

AM3을 통해 .wav 파일을 서버에 저장하는 데 성공적으로 사용할 수있는 AS3에 마이크 작동 스크립트가 있습니다. 이러한 파일은 이상한 효과가없는 오디오 플레이어에서 정상적으로 재생됩니다. (AudioRecorder라는 클래스 내에서)이 문제없이 작동AS3 마이크 녹음/저장 작동, 인 플래시 PCM 재생 두 배 속도

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

을 :

는 참고로, 여기에 내가 마이크의이 ByteArray를 캡처하고있는 중이 것입니다. 녹음이 완료된 후 _rawData 변수를 가져 와서 WavWriter 클래스 등을 통해 실행할 수 있습니다.

그러나 adobe 요리 책에서 수정 한 다음 코드를 사용하여이 동일한 ByteArray를 사운드로 실행하면 다음과 같이됩니다. (within 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

당신은 AS3 질문에 대해 "액션 스크립트-3"태그에 충실해야한다. 그것이 일반적으로 사용되는 것입니다. – ktdrv

답변

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

그래서 그것은 스테레오/모노 물건이었습니다! 나는 두 번 writeFloat을 생각하지 않았다, 고마워! – Lowgain

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