Воспроизведение микрофона с использованием кодека SPEEX в Flex - PullRequest
3 голосов
/ 29 марта 2011

Я работаю над проектом, в котором пользователь должен записать свой голос и отправить его на сервер.Но перед отправкой пользователю может понадобиться воспроизвести записанный звук.

Приложение имеет функции записи и воспроизведения с кодеком 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 илимикрофон.рейт = 16;

Ответы [ 2 ]

2 голосов
/ 07 июня 2011

Во вспышке звуковой объект воспроизводится с частотой 44 кГц.Поскольку вы производите выборку с частотой 16 кГц, вы отправляете данные через обработчик событий SampleDataEvent на 2,75 быстрее, чем получаете эти данные.

То есть, если вы отправили его дважды.

Но вы на самом деле пытаетесь решить эту проблему, записывая в 3 раза быстрее, чем записываете.Это все еще не оптимально, вы получите немного замедленную версию записи, потому что вы сейчас отправляете данные, как если бы они были записаны на частоте 48 кГц, но вы отправляете их как 44 кГц.

Есть только две вещи, которые вы можете сделать, и я думаю, что вы уже делаете их.

либо отрегулируйте, сколько записей вы делаете за итерацию в цикле for.или отрегулируйте максимальный прирост (2048) на большее значение, но оно не может превышать 8192. Я думаю, что

У меня была такая же проблема, когда я записывал в speex.

1 голос
/ 21 июня 2011
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);
}
...