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