as3中的getMicrophone()仅在使用setLoopBack()时有效

时间:2013-07-17 23:31:33

标签: actionscript-3 flash audio microphone

我想用闪光灯监听麦克风音频输入(as3)。

这只是我代码的一小部分,但实际上问题出在那里。

var mic:Microphone = Microphone.getMicrophone();
mic.setLoopBack(true);

addEventListener( Event.ENTER_FRAME, loop );

function loop( event:Event ):void {
    trace( mic.activityLevel );
}

如果我使用类似的代码,我可以追踪activityLevel,实际上可以看到一些值..(我认为这是卷?)

嗯,唯一的问题是,音频也输出到了扬声器,我不想要的......(mic.setLoopBack(true);

但是,当我尝试mic.setLoopBack(false);时,Flash不再要求麦克风提交,并且跟踪的activityLevel保持“-1”.....

那么我该怎么做才能禁用音频环回或只是监听麦克风的音频数据。 ?

(当我说“音频数据”时,我的意思是后来的BPM检测所需的所有数据......我认为它是音频的字节数组,不是吗?)

2 个答案:

答案 0 :(得分:4)

作为静音麦克风的临时解决方案,您可以尝试:

var st:SoundTransform = new SoundTransform(0);
mic.soundTransform = st;

您仍应看到活动级别。

答案 1 :(得分:3)

您只需要从setLoopBack()收听SampleDataEvent,而不是使用Microphone。请注意this Adobe article中标题为“检测麦克风活动”的部分,特别是此说明中介绍了可以侦听麦克风活动的方法:

  

注意:当您的应用程序监控麦克风时,Microphone对象仅调度Activity事件。因此,如果不调用setLoopBack(true),为示例数据事件添加侦听器,或将麦克风附加到NetStream对象,则不会调度任何活动事件。

var mic:Microhpone = Microphone.getMicrophone;
mic.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData);

function onSampleData(event:SampleDataEvent):void
{
    trace("activity from: " + mic.name + " level: " + mic.activityLevel);
}

这应该是一个更优化的解决方案,因为SampleDataEvent仅在麦克风检测到声音时发送,而不是当前适用于每一帧的方法。