1

我正在创建一个项目,但我遇到了一些问题,该项目包括两个人在两个麦克风上尖叫,然后用那个尖叫声填满一个酒吧。问题是闪存如何同时与这两个输入一起工作,这就是代码。

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 没有解决

提前致谢

4

2 回答 2

1

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

一种解决方案是改为为SampleDataEvent.SAMPLE_DATA. 如果您想捕获音频并对其进行处理,您将使用此事件。使用此事件,您可以侦听来自多个麦克风的数据。我已经构建了一个“相机/麦克风”向导,它可以同时显示多个麦克风的活动级别。唯一的缺点是与 using 不同setLoopBack(true),它不会向您播放音频。但是既然你得到了SampleDataEvent.SAMPLE_DATA,你可以构造一个声音对象,如果你真的需要的话,你可以把它回放给用户。

因此,不要启用环回模式并使用 aTimer来查询每个麦克风的活动级别,而是添加以下侦听器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);
}

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

参考: 捕获声音输出——注意标题为“检测麦克风活动”的部分,特别是“注意:”关于可以检测活动的 3 种不同方式:使用 setLoopBack(true)、为 . 添加侦听器SampleDataEvent.SAMPLE_DATA和附加麦克风到一个NetStream。此页面还显示了如何Sound从示例中创建对象。

于 2013-06-13T19:09:23.113 回答
0

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

于 2013-06-14T10:05:27.043 回答