2013-02-18 30 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; 
     } 
    } 

}