1

我正在尝试播放从麦克风捕获的 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 和这里的新手。非常感谢任何帮助。谢谢。

4

2 回答 2

0

有些麦克风非常敏感。您需要调整适度的设置,如下所示。此外,如果扬声器更靠近麦克风,声音会循环播放。

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

有关声音捕获的更多信息,请尝试此, 捕获麦克风声音数据

于 2013-02-18T05:27:25.850 回答
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;
        }
    }

}
于 2016-02-24T20:57:43.750 回答