2013-06-13 1 views
1

Я создаю проект, но у меня есть некоторые проблемы, проект состоит из двух человек, кричащих на двух микрофонах, и наполнения бара этим криком. Проблема в том, как одновременная работа вспышки с этими двумя входами, это код.Два одновременных входа микрофона во 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 две работы в порядке: \

Аппаратура подключается через два разных порта USB.

Netstream не решен

Заранее спасибо

+0

Входит ли вход от двух микрофонов? –

+0

Да, это все понятно. – Vortex10

+0

+1 Одной из моих краткосрочных целей является создание игры/приложения, которую родители раздражают, когда их дети играют в нее. Со всем этим криком у вас есть уверенный победитель на ваших руках :) –

ответ

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 (истина), добавление слушателя для SampleDataEvent.SAMPLE_DATA , и подключив микрофон к NetStream. На этой странице также показано, как можно создать объект Sound из образцов.

+0

Это сработало, действительно спасибо и спасло мою жизнь;) – Vortex10

+0

Большое спасибо за предложение метода 'SampleDataEvent'. – jamix

0

У меня была аналогичная проблема несколько лет назад, поэтому я бы поделился своим решением. Вставьте два флеш-проекции (swfs) на свою страницу, затем сделайте их связь через html. Затем вы можете управлять обоими swf и получать информацию о парах. Надеюсь, эта помощь.

 Смежные вопросы

  • Нет связанных вопросов^_^