【问题标题】:How do I detect if a new microphone is available?如何检测是否有新的麦克风可用?
【发布时间】:2011-06-02 05:56:27
【问题描述】:

看来,如果有可用的麦克风,则可以为 StatusEvent 添加事件侦听器。但是,这只会告诉您麦克风是被允许还是被禁止。

我真正想做的是检测静态 Microphone.names 属性是否发生变化。我本来希望这个属性是可绑定的。

如果我在插入麦克风后立即右键单击并选择“设置”,我可以看到 flash 已经更新了他们的可用麦克风列表。但是,我似乎无法在代码中收到相同的更新。

文档说“调用 Microphone.names 需要对硬件进行广泛检查,并且可能需要几秒钟来构建阵列。”所以我认为每隔几秒轮询一次这个选项是不可行的。

【问题讨论】:

  • 我认为运行时(Flash 或 AIR)不会公开此信息。我希望在插入新麦克风后重新检查;会找到新的麦克风。但是,我不希望 AIR 或 Flash 告诉您此系统细节已更改。

标签: flash apache-flex actionscript-3 microphone


【解决方案1】:

我不确定您是否可以在 Microphone 的“名称”数组上设置一个实际工作的更改观察程序,因为只有在每次更新对数组的引用时才会调用观察程序(新数组)。所以这是未经测试的,但可以尝试一下:

var watcher:ChangeWatcher = ChangeWatcher.watch(Microphone, ['names'], onNameChange);

只需要创建 onNameChange 处理程序来查看它是否真正被调用。如果这不起作用,那么您需要每隔 x 时间对名称进行某种“轮询”。

【讨论】:

    【解决方案2】:

    我运行了一个小测试脚本:

    var ta:TextArea = new TextArea();
        ta.width = ta.height = 500;
        addChild(ta);
        var t:Timer = new Timer(5000);
        t.addEventListener(TimerEvent.TIMER, function(e:Event):void{
            var t0:uint = getTimer();
    
            var m:* = Microphone.getMicrophone();
    
            ta.text += "mic found: "+(m?true:false)+" "+(getTimer()-t0);
    
            t0 = getTimer();
            var o:* = Microphone.names;
            ta.text += "\t\ttime to get names: "+(getTimer()-t0)+"\n";
    
        });
        t.start();
    

    结果总是少于 10 毫秒(getMicrophone 为 0-3 毫秒,名称为 2-9 毫秒),这对我来说似乎相当快。我不知道,也许是我的电脑,但它似乎并没有太密集。由于我只需要 getMicrophone,因此没有关于它的使用的官方警告,而且它的速度略快,我将每隔几秒左右轮询一次 getMicrophone 来处理这个问题。

    如果这里有人关心运行此脚本并对您的结果提供一些反馈,它可能会帮助我和其他人做出更好的选择。

    【讨论】:

    • 你是对的,轮询不会花费很长时间来运行,尤其是在 5 秒的时间间隔内。但是,我做了 -1 以考虑其他答案的想法并回答自己。
    • 我只是想让这个线程对阅读它的人最有用。在我看来,您和 joanllenas 的答案都不是完全正确的,因此将它们标记为正确会令人困惑。如果有更好的方法来实现这一点,请告诉我。这不是一场自我竞争。因为您不喜欢回答的人而将答案标记为对这个社区没有帮助。
    • 如果你想让这个帖子有帮助,你可以评论其他提到投票方法的答案,并要求对此进行扩展。
    【解决方案3】:

    正如你所说,没有任何事件暴露在这件事上。 该属性不可绑定,因为 Microphone 是 Fl​​ash 播放器功能,而不是 Flex Microphone 包装器(至于今天的绑定仅限于 Flex)。

    我建议您每隔几秒轮询一次 Microphone.getMicrophone() 并断言它不为空。与 Microphone.names 相比,此调用的“考试强度”要小得多。

    【讨论】:

    • -1。 Microphone.getMicrophone() 不正确,无法绑定“flash features”。
    • 1.绑定仅适用于 Flex 2。麦克风是 Flash Player 的一项功能。
    • 让我解释一下为什么您的回复是错误的以及为什么您对我的回答评分为-1:ChangeWatcher 之所以具有弹性,只是因为它依赖于绑定机制。正如我所说,Microphone 不是 Flex 类,它是 Flash Player 类,这就是为什么它永远不能连接到 flex 绑定机制的原因。如果你想做这样的事情,你必须创建一个包装器,创建一个'names'属性[Bindable],轮询麦克风直到它准备好,然后更改'names'上的值。然后将通知所有 MicWrapper 客户端有关更改。我希望这能澄清我想说的话。
    猜你喜欢
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多