【问题标题】:How to select destination output device using Web Audio Api如何使用 Web Audio Api 选择目标输出设备
【发布时间】:2017-06-11 07:29:47
【问题描述】:

我一直在使用网络音频 api 并创建了一个上下文,并用数据填充了一个源缓冲区。它在默认输出设备上播放良好,但我不明白如何选择目的地。在旧的 w3 规范中,您可以将正确的 deviceId 传递给音频上下文构造函数,但我现在不知道如何在不使用媒体元素的情况下执行此操作。有什么建议吗?

source = context.createBufferSource()
source.loop = true;
source.buffer = globalAudioBuffer;
source.connect(context.destination);
context.resume();
source.start(0);

【问题讨论】:

    标签: api audio web web-audio-api


    【解决方案1】:

    很遗憾,设置 webaudio graph 的目标音频设备尚未实现,为此的 api 尚未最终确定。

    您现在可以做的是将 webaudio 图形连接到 HTML 元素和set the sinkid of the element(目前仅适用于 Chrome)

    这是一个简单的例子:

    var ac = new AudioContext();
    var audio = new Audio();
    var o = ac.createOscillator();
    o.start();
    var dest = ac.createMediaStreamDestination();
    o.connect(dest);
    audio.src = URL.createObjectURL(dest.stream);
    audio.play();
    

    现在您的振荡器将通过音频元素播放 您现在可以使用已连接输出设备的 deviceId 调用 audio.setSinkId()

    【讨论】:

    • 祝你好运。如果您想了解此功能的状态,可以关注open issue
    • 奇怪的是,这种方法在主线程负载很重(例如在短时间内启动大量振荡器)和失谐的音频输出(!) i> 几秒钟后,可从 chrome 56 一直观察到 63(当前)。我的假设是主线程负载会干扰MediaStream 对象或HTMLAudioElement。有这方面的经验吗?
    • @JohnWeisz 这是一个更新的 Chrome 问题:bugs.chromium.org/p/chromium/issues/detail?id=766198
    • @Asher 我认为您可以省略创建 ObjectUrl。当audio.srcObject 接收流时,您可以通过以下方式调整倒数第二行:audio.srcObject = dest.stream; 其他一切都应该可以正常工作,但如果您不撤消创建的 ObjectURL,则不会发生内存泄漏。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多