两个麦克风同时输入Flash?

时间:2013-06-13 13:51:57

标签: actionscript-3 flash actionscript microphone

我正在创建一个项目,但我遇到了一些问题,该项目包括2个人在两个麦克风上尖叫,并用尖叫声填满酒吧。 问题是flash如何同时使用这两个输入,这就是代码。

import flash.events.ActivityEvent;
import flash.events.StatusEvent;
import flash.media.Microphone
var myTimer:Timer = new Timer(500);
myTimer.addEventListener(TimerEvent.TIMER, onMicActivity);
myTimer.start();

var deviceArray:Array = Microphone.names;
var micaux = 0;
var micaux2 = 0;
trace("Available sound input devices:");

for (var i:int = 0; i < deviceArray.length; i++)
{
    trace(" " + deviceArray[i]+ " " + i);
}

var mic:Microphone = Microphone.getMicrophone();
var mic2:Microphone = Microphone.getMicrophone(1);
trace("mic1 "+mic.name);
trace("mic2 "+mic2.name);
mic.gain = 60;
mic.rate = 11;
mic.setUseEchoSuppression(true);
mic.setLoopBack(true);
mic.setSilenceLevel(5, 1000);
mic2.gain = 60;
mic2.rate = 11;
mic2.setUseEchoSuppression(true);
mic2.setLoopBack(true);
mic2.setSilenceLevel(5, 1000);

function onMicActivity(event:TimerEvent):void
{
    //trace("activating="  + ", activityLevel=" +  
    // mic.activityLevel);
    if (mic.activityLevel > 3) {
    micaux = micaux + mic.activityLevel;
    }
    if (mic2.activityLevel >3){


    micaux2 = micaux2 + mic2.activityLevel; }
    trace("mic1 " +mic.activityLevel);
    trace("mic 2" +mic2.activityLevel);
    if (micaux>0){
        soundbox.text = String(micaux);
        healthBar.barColor.x +=  mic.activityLevel / 50;
        healthBar.barColor.scaleX +=  mic.activityLevel / 50;}
    if (micaux2>0){ 
        soundbox2.text = String(micaux2);
        healthBar2.barColor.x +=  mic2.activityLevel / 50;
        healthBar2.barColor.scaleX +=  mic2.activityLevel / 50;
    }

Soundbox出现在用户得分的位置,而healthbar.barcolor是用该分数填充的栏,当我运行此代码时它看起来一切正常,但当我打开swf的设置时只有1个麦克风工作两个工作正常:\

硬件通过两个不同的USB端口连接。

NETSTREAM没有解决

提前致谢

2 个答案:

答案 0 :(得分:1)

我认为问题在于您无法一次为多个麦克风启用麦克风环回。我的经验是,您setLoopBack(true)使用的最后一个麦克风是捕获音频的麦克风。

一种解决方案是为SampleDataEvent.SAMPLE_DATA添加一个监听器。如果您想要捕获音频并使用它执行某些操作,则可以使用此事件。使用此事件,您可以侦听来自多个麦克风的数据。我已经构建了一个“相机/麦克风”向导,它同时显示了来自多个麦克风的活动水平。唯一的缺点是,与使用setLoopBack(true)不同,它不会播放给您的音频。但是,由于您获得了SampleDataEvent.SAMPLE_DATA,您可以构建一个声音对象,并在需要时将其播放给用户。

因此,不是启用环回模式并使用Timer查询每个麦克风的活动级别,而是为SampleDataEvent.SAMPLE_DATA添加侦听器:

mic1.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData);
mic2.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData);

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

这实际上比使用Timer更好,因为如果你的计时器每500毫秒运行一次,它可能会错过用户说话的时候。如果计时器在用户没有说什么时触发,则不会检测到声音。 SampleDataEvent方法没有这个问题。

参考文献: Capturing Sound Output - 请注意标题为“检测麦克风活动”的部分,特别是关于可以检测活动的3种不同方式的“注意:”:通过使用setLoopBack(true),为{{1}添加一个监听器},并将麦克风连接到SampleDataEvent.SAMPLE_DATA。此页面还显示了如何从样本中创建NetStream对象。

答案 1 :(得分:0)

几年前我遇到过类似的问题,所以我会分享我的解决方案。 在您的页面上嵌入两个flash投影(swfs),然后通过html进行通信。 然后,您可以控制swf并获取共享的蒸汽信息。 我希望这有帮助。