2013-02-18 32 views
1

我试图从麦克风捕获的ByteArray播放声音,我期待听到来自麦克风的声音,但我得到的只是随机的,扭曲的声音。这是我现在使用的代码:如何从AS3中的麦克风字节阵列播放声音?

var playBa:ByteArray; 

var player:Sound = new Sound(); 
sound.addEventListener(SampleDataEvent.SAMPLE_DATA, playMic); 
sound.play(); 

var mic:Microphone = Microphone.getMicrophone(); 
mic.gain = 100; 
mic.rate = 44; 
mic.setSilenceLevel(0, 4000); 
mic.addEventListener(SampleDataEvent.SAMPLE_DATA, onMicSample); 

function playMic(e:SampleDataEvent):void 
{ 
    if (playBa != null) e.data.writeBytes(playBa, 0, playBa.length); 
} 

function onMicSample(e:SampleDataEvent):void 
{ 
    playBa = e.data; 
    playBa.position = 0; 
    player.play(); 
} 

和扭曲的声音,几秒钟后,这是我在输出窗口有:

RangeError: Error #2004: One of the parameters is invalid. 
at flash.media::Sound/play() 
at vclass_fla::MainTimeline/onMicSample() 

请帮助我。我是一个全新的AS3和这里。任何帮助,高度赞赏。谢谢。

回答

0

一些麦克风非常敏感。您需要调整中等设置,如下所示。另外,如果扬声器靠近麦克风,声音就会循环播放。

var myMic:Microphone = Microphone.getMicrophone(); // detect microphone 
myMic.gain = 50; 
myMic.setUseEchoSuppression(true); 
myMic.setLoopBack(true); 
myMic.setSilenceLevel(50, 1000); 

为了更了解声音捕获尝试此, Capturing microphone sound data

+0

感谢您的代码,但结果仍然是一样的。我需要的是从麦克风获取字节数组,然后在使用相同的字节数组的同时将其发送到服务器,将字节数组播放到Sound类。 – 2013-02-18 08:29:06

+0

在你的代码中,你可以展示如何创建“声音”对象? – 2013-02-18 09:31:59

+0

我相信我已经展示了如何创建“声音”对象。看看上面的代码。球员是声音的对象。 – 2013-02-18 09:50:13

0

的问题是,样本数据事件需要的2048块至8192个样本。如果在“playMic”调用时通过麦克风录制的样本运行时会抛出“RangeError:Error#2004 ...”。

function playMic(event:SampleDataEvent):void 
{ 
    trace("sample event"); 
    for (var ii:uint = 0; ii < 8192 && playBa.bytesAvailable > 0 ; ii++) 
    { 
     var n1:Number = playBa.readFloat(); 
     //trace(n1); 
     event.data.writeFloat(n1); 
     event.data.writeFloat(n1); 
     if(playBa.bytesAvailable == 0) 
     { 
      trace("data_finished"); 
      break; 
     } 
    } 

}