2011-03-29 45 views
3

我正在開發一個項目,用戶必須錄製他/她的聲音並將其提交給服務器。但在提交之前,用戶可能需要播放錄製的聲音。在Flex中使用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

在Flash中,聲音對象播放在44kHz的。由於您採樣的採樣頻率爲16khz,因此您通過SampleDataEvent事件處理程序以2.75的速度發送數據,然後您就可以獲取該數據。

也就是說,如果你兩次發送。

但你實際上是試圖通過編寫比你記錄什麼3倍的速度來解決這個問題。這仍然不是最佳的,你會得到一個緩慢的錄製版本,只是一點點,因爲你現在發送的數據就好像它是以48 kHz記錄的一樣,但是你將它發送爲44khz。

你只能做兩件事,而且我認爲你已經在做。

要麼調整多少寫你每次迭代循環做那個。或將最大增量(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); 
}