【问题标题】:Microphone playback with SPEEX codec in Flex在 Flex 中使用 SPEEX 编解码器播放麦克风
【发布时间】:2011-03-29 12:40:10
【问题描述】:

我正在做一个项目,用户必须录制他/她的声音,并将其提交到服务器。但在提交之前,用户可能需要播放录制的声音。

该应用程序具有使用 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 编解码器或mic.rate = 16 进行麦克风播放的任何解决方案;

【问题讨论】:

    标签: apache-flex flex4 microphone speex


    【解决方案1】:

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

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

    但您实际上是在尝试通过比您正在录制的内容快 3 倍的速度来解决这个问题。这仍然不是最佳的,您会得到一个较慢的录制版本,只是一点点,因为您现在发送的数据好像是以 48 khz 录制的,但您是以 44khz 发送的。

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

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

    我在 speex 录制时遇到了同样的问题。

    【讨论】:

      【解决方案2】:
      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);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-15
        • 2018-06-18
        • 1970-01-01
        • 2018-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多