2011-03-29 3 views
3

나는 사용자가 자신의 목소리를 녹음하고 서버에 제출해야하는 프로젝트를 진행하고 있습니다. 그러나 제출하기 전에 사용자는 녹음 된 사운드를 재생해야 할 수도 있습니다.플렉스 SPEEX 코덱을 사용한 마이크 재생

응용 프로그램의 녹음 재생 기능은 SPEEX 코덱입니다. 하지만 내가 뭘 발견 이상하고 어려운 내가 사용자가 녹음 된 오디오를 재생할 때, 재생 속도가 빠르거나 이해할 수없는 정상보다 느립니다. 마치 그것의 빠른 전달.

private var mic:Microphone; 
private var rec:ByteArray; 
private var snd:Sound; 
private var channel:SoundChannel; 

protected function recBtn_clickHandler(event:MouseEvent):void 
{ 

    rec = new ByteArray(); 
    mic = Microphone.getMicrophone(); 
    mic.setLoopBack(false); 
    mic.setUseEchoSuppression(true); 
    mic.gain = 50; 
    mic.setSilenceLevel(5, 1000); 
    mic.codec = SoundCodec.SPEEX; 

    mic.addEventListener(SampleDataEvent.SAMPLE_DATA, getMicAudio); 

} 

protected function plyBtn_clickHandler(event:MouseEvent):void 
{ 

    snd.addEventListener(SampleDataEvent.SAMPLE_DATA, playRecorded); 

    channel = snd.play();    
}  

private function getMicAudio(e:SampleDataEvent): void 
{ 

    rec.writeBytes(e.data); 

} 

private function playRecorded(e:SampleDataEvent): void 
{ 

    if (!rec.bytesAvailable > 0) return; 

    for (var i:int = 0; i < 2048; i++){ 
      var sample:Number = 0; 
      if (rec.bytesAvailable > 0) sample = rec.readFloat(); 

      for (var j:uint = 0; j < 6; j++) { 
       e.data.writeFloat(sample); 
      } 
    } 
} 

이 시나리오는 발생할 때 : : 여기

샘플 코드입니다

  1. mic.codec = SoundCodec.SPEEX;
  2. mic.rate = 16

내가 포럼을 많이 겪었지만, SPEEX 코덱 또는 microphone.rate = 16 마이크 재생을위한 모든 솔루션을 찾을 수 없습니다;

답변

2

플래시에서는 사운드 개체가 44khz에서 재생됩니다. 16khz에서 샘플링 중이기 때문에 SampleDataEvent 이벤트 처리기 2.75를 통해 데이터를 보내는 것이 더 빠릅니다. 그런 다음 데이터를 가져 오는 중입니다.

즉, 두 번 보내는 경우입니다.

그러나 실제로이 문제는 녹음하는 것보다 3 배 빠르게 작성하여 해결하려고합니다. 이것은 여전히 ​​최적이 아닙니다. 레코딩 속도가 느려질 것입니다. 48khz로 레코딩 한 것처럼 데이터를 보내고 있기 때문에 44khz로 보내고 있기 때문입니다.

할 수있는 일은 두 가지뿐입니다. 이미 수행하고있는 것 같습니다.

은 for 루프에서 반복 당 수행하는 쓰기 수를 조정합니다. 또는 최대 증분 (2048)을 더 높은 수로 조정할 수 있지만 8192를 초과 할 수 없습니다.

나는 speex에서 기록 할 때 동일한 문제가있었습니다.

1
e.data.writeFloat(sample); 

e.data.writeFloat(sample); 

e.data.writeFloat(sample); 

e.data.writeFloat(sample); 
if (i%3) 
{ 
    e.data.writeFloat(sample); 
    e.data.writeFloat(sample); 
}