如何在AS3中播放麦克风字节数组的声音?

时间:2013-02-18 05:11:05

标签: actionscript-3 audio bytearray playback microphone

我正在尝试播放从麦克风捕获的ByteArray的声音,我希望听到麦克风发出的声音,但我得到的只是随机的,扭曲的声音。这是我现在使用的代码:

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和这里都是全新的。任何帮助都非常感谢。感谢。

2 个答案:

答案 0 :(得分: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

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

}