使用Flex中的SPEEX编解码器播放麦克风

时间:2011-03-29 12:40:11

标签: flex flex4 microphone 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
  3. 我经历过很多论坛,但找不到任何使用SPEEX编解码器或麦克风播放麦克风的解决方案.rate = 16;

2 个答案:

答案 0 :(得分:2)

在闪光灯中,声音对象以44khz播放。由于您的采样速率为16khz,因此您通过SampleDataEvent事件处理程序发送数据的速度比获取数据的速度快2.75。

也就是说,如果你发送了两次。

但是你实际上试图通过写入比你录制的速度快3倍来解决这个问题。这仍然不是最佳的,你会得到一个减慢版本的录音,只是一点点,因为你现在发送的数据好像它是以48千赫兹录制的,但你发送它是44khz。

你只能做两件事,我认为你已经在做了。

要么调整for循环中每次迭代执行的写入次数。或者将最大增量(2048)调整到更高的数字,但我相信它不能超过8192。

当我用speex记录时,我遇到了同样的问题。

答案 1 :(得分: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);
}