【问题标题】:Change active microphone in AS3在 AS3 中更改活动麦克风
【发布时间】:2012-06-18 21:57:33
【问题描述】:

有没有办法在不使用 SecurityPanel.MICROPHONE 的情况下更改 AS3 中的活动麦克风?我的所有尝试都会停止所有麦克风活动,即使是由单击按钮触发的。

如果我这样做:

var mic:Microphone = Microphone.getMicrophone(index);

我可以收听并获取麦克风活动、级别和 SampleEvents。一切正常。

如果以后我这样做:

mic = Microphone.getMicrophone(newIndex);

我开始为 mic.activityLevel 获得 -1 并且没有收到 SampleEvents,但我可以通过

获得新麦克风的正确名称
mic.name;

为简单起见,假设 index 和 newIndex 都是经过测试的工作源,并且如果与初始麦克风请求一起传入,则两者都可以工作。

这是否被视为安全风险并且不允许?一旦你初始化了一个麦克风,这就是你所坚持的吗?我已经在空中切换了摄像头,但那是空中。

*作为旁注,我不能使用 SecurityPanel 来执行此操作,因为如果计算机连接到扬声器,从 osx 上的 FireFox 访问时可能会出现反馈。我曾尝试在打开窗口之前将所有声音输出降至 0,但一旦 SecurityPanel.MICROPHONE 处于活动状态,音量就会恢复。不幸的是,仅仅要求用户关闭他们的扬声器,这不是一种选择。

【问题讨论】:

  • 可以在用户授予访问权限后切换麦克风。您是否有机会使用增强型麦克风?使用增强型麦克风时,使用多个麦克风可能会遇到困难。
  • 只是一个愚蠢的问题,你是在做mic = Microphone.getMicrophone(newIndex);之后添加新的事件监听器吗?
  • Sunil D. - 在有人授予访问权限但未使用增强型麦克风后,我遇到了这个问题。
  • bmleite - 天哪,我可能不是,周一会检查。这可能是我最近做过的最尴尬的事情了。
  • 不幸的是,不是听众。作为测试,我正在轮询一个 var _mic:Microphone,每 0.1 秒使用 _mic.activityLevel。并且每 3 秒,我使用 _mic=getMicrophone(_newIndex); 将 _mic 变量更新为不同的麦克风。如果我在 2 个麦克风之间来回切换,那么当我切换到它时,在 securityPanel 中最后选择的那个处于活动状态,但另一个只返回 -1。

标签: actionscript-3 flash microphone


【解决方案1】:

根据我的经验,有两个原因会导致 activityLevel 报告 -1:

1.用户没有接受安全权限

这可以通过 StatusEvent.STATUS 检测到并检查 mic.muted 属性。

mic.addEventListener(StatusEvent.STATUS, onMicrophoneStatus, false, 0, true);

private function onMicrophoneStatus(event:StatusEvent):void
{           
    if (event.code == "Microphone.Unmuted") 
        trace("Microphone access was allowed."); 
    else if (event.code == "Microphone.Muted") 
        trace("Microphone access was denied."); 
}

2.第二个原因似乎更深奥,与两件事有关。麦克风是否进入环回模式;如果麦克风有 *SampleDataEvent.SAMPLE_DATA* 监听器。

我无法准确解释其背后的逻辑,但我认为将麦克风发送到环回模式会初始化一些事件逻辑。你甚至可以做 mic.setLoopBack(true); mic.setLoopBack(false);.

我希望有人能解释一下后台到底发生了什么。

3.关于面板打开时出现巨大回声的第二个问题,rockabit 找到了一个很好的技巧来解决这个问题。您必须将麦克风的 SoundTransform 属性设置为音量为 0 的声音转换对象。这允许您将麦克风保持在环回模式但防止巨大的回声和反馈以及从输出中删除麦克风捕获的声音。

这是供参考的线程: http://www.rockabit.com/2009/01/14/microphone-activitylevel-in-flash/

最后,这是我用来初始化麦克风的 sn-p 代码,即使在更换麦克风时也能正常工作:(为清楚起见,剪掉了)

private function initializeMicrophone(micIndex:int = 0):void
{   
    trace("Initialize mic: "+micIndex);

    var gain:int = 70;
    var rate:int = 44;
    var silence:int = 0;
    var timeout:int = 100;

    this.microphone = Microphone.getEnhancedMicrophone(micIndex);
    mic.addEventListener(StatusEvent.STATUS, onMicrophoneStatus, false, 0, true);
    mic.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData);

    mic.gain = gain;
    mic.setSilenceLevel(silence, timeout);
    mic.rate = rate;

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

    mic.codec = SoundCodec.NELLYMOSER;
    mic.setUseEchoSuppression(true);
    mic.setLoopBack(true);

    var micOptions:MicrophoneEnhancedOptions = new MicrophoneEnhancedOptions();
    micOptions.mode = MicrophoneEnhancedMode.FULL_DUPLEX;
    micOptions.nonLinearProcessing = true;
    micOptions.echoPath = 128;
    mic.enhancedOptions = micOptions;
}

private function onSwapMicrophone():void
{
    if(this.mic.index == 0)
      initializeMicrophone(1);
    else
      initializeMicrophone(0);
}

希望这会有所帮助!

-b

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 2021-09-01
    相关资源
    最近更新 更多