我正在创建一个项目,但我遇到了一些问题,该项目包括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没有解决提前致谢
答案 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并获取共享的蒸汽信息。 我希望这有帮助。