2012-09-17 4 views
1

마이크에서 오디오를 녹음하고 있지만 WaveEncoder (또는 다른 인코더 - 여러 번 시도한)를 사용하여이 원시 데이터를 wav 형식으로 인코딩하려고하면 너무 빨리 생성됩니다 초당 샘플) 음성을 44100Hz로 전송합니다. 여기에 인코딩을위한 코드입니다 :WAV 형식의 원시 데이터 - 조정 비율 44100

private static const RIFF:String = "RIFF"; 
private static const WAVE:String = "WAVE"; 
private static const FMT:String = "fmt "; 
private static const DATA:String = "data"; 

public function encode(samples:ByteArray, channels:int=2, bits:int=16, rate:int=44100):ByteArray 
{ 
    var data:ByteArray = create(samples); 

    _bytes.length = 0; 
    _bytes.endian = Endian.LITTLE_ENDIAN; 

    _bytes.writeUTFBytes(WaveEncoder.RIFF); 
    _bytes.writeInt(uint(data.length + 44)); 
    _bytes.writeUTFBytes(WaveEncoder.WAVE); 
    _bytes.writeUTFBytes(WaveEncoder.FMT); 
    _bytes.writeInt(uint(16)); 
    _bytes.writeShort(uint(1)); 
    _bytes.writeShort(channels); 
    _bytes.writeInt(rate); 
    _bytes.writeInt(uint(rate * channels * (bits >> 3))); 
    _bytes.writeShort(uint(channels * (bits >> 3))); 
    _bytes.writeShort(bits); 
    _bytes.writeUTFBytes(WaveEncoder.DATA); 
    _bytes.writeInt(data.length); 
    _bytes.writeBytes(data); 
    _bytes.position = 0; 

    return _bytes; 
} 

는 그리고 여기 내가 ActionScript에서 마이크를 초기화하는 방법 :

soundClip = new ByteArray(); 
microphone = Microphone.getMicrophone(); 

microphone.rate = 44; 
microphone.gain = 100; 
microphone.addEventListener(SampleDataEvent.SAMPLE_DATA, microphone_sampleDataHandler); 


protected function microphone_sampleDataHandler(event:SampleDataEvent):void 
{ 
    level.width = microphone.activityLevel * 3; 
    level.height = microphone.activityLevel * 3; 

    while (event.data.bytesAvailable) 
    { 
     var sample:Number = event.data.readFloat(); 
     soundClip.writeFloat(sample); 
    } 
} 

은 내가 22050에 속도를 감소하는 경우에만 정상적인 연설을 달성 할 수 있지만, 나는 그것이 나중에 44,100되고 싶어요 내가 할거야. 어떤 제안?

+0

마이크 사운드는 모노이지만 스테레오 (2 채널)로 인코딩하고 있습니다. 'microphone_sampleDataHandler' 함수에서 샘플을 몇 번 푸시하고 있습니까? 가능한 경우 해당 코드를 추가하십시오. – Moorthy

+0

게시물을 업데이트하고 microphone_sampleDataHandler 함수를 포함했습니다. –

+0

내 대답을 확인하십시오. – Moorthy

답변

0

시도해보십시오. 도움이 될 것입니다

protected function microphone_sampleDataHandler(event:SampleDataEvent):void 
{ 
    level.width = microphone.activityLevel * 3; 
    level.height = microphone.activityLevel * 3; 

    while (event.data.bytesAvailable) 
    { 
     var sample:Number = event.data.readFloat(); 
     soundClip.writeFloat(sample); 
     soundClip.writeFloat(sample); 
    } 
} 
+0

예, 저에게 도움이되었습니다. 감사합니다! –

관련 문제