【问题标题】:Chrome: Wrong sound when changing the audio source for Audio element and MediaStreamAudioDestinationNodeChrome:更改音频元素和 MediaStreamAudioDestinationNode 的音频源时声音错误
【发布时间】:2016-12-22 18:08:24
【问题描述】:

我有一个应用程序可以播放不同的代码生成的声音。我将这些声音放在AudioBufferSourceNode. 我允许用户选择通过什么输出设备播放声音,所以我使用MediaStreamAudioDestinationNode,其流用作音频元素的源。这样,当用户选择音频输出来播放声音时,我会将 Audio 元素的 Sink Id 设置为请求的音频输出。

所以我有 AudioBufferSourceNode -> 一些音频图(增益节点等) -> MediaStreamAudioDestinationNode -> 音频元素。

当我播放第一个声音时,它听起来不错。但是,当我创建一个新源并将其连接到同一个 MediaStreamAudioDestinationNode 时,播放的声音音调错误。

我创建了显示问题的a Fiddle

这是一个错误,还是我做错了什么?

【问题讨论】:

    标签: google-chrome web-audio-api audiocontext


    【解决方案1】:

    可以使用.connect() and .disconnect() 动态更改图形布局,即使音频正在播放或通过流(甚至可以通过WebRTC 流式传输)发送。 我找不到参考in the spec,所以我很确定这是理所当然的。

    例如,如果您有两个 AudioBufferSourceNodes bufferSource1bufferSource2,以及一个 MediaStreamAudioDestinationNode streamDestination

    bufferSource1.connect(streamDestination);
    
    //do some other things here, and after some time, switch to bufferSource2:
    
    //(streamDestination doesn't need to be explicitly specified here)
    bufferSource1.disconnect(streamDestination); 
    bufferSource2.connect(streamDestination);
    

    Example in action


    编辑 1:

    正确实施:

    根据Editors Draft on the Audio Output API,计划/将可以为 AudioContext 选择自定义音频输出设备(通过new AudioContext({ sinkId: requestedSinkId });)。我找不到任何有关进度的信息,甚至找到了提问者显然已经阅读过的related discussion。根据这个和(许多)其他参考资料,这似乎不是一件容易的事,但it's planned for WA V1

    编辑: 该部分已从 API 草案中删除,但您仍然可以在 older version 中找到它。

    当前解决方法:

    我玩弄了您的解决方法(使用MediaStreamAudioDestinationNodeAudio 对象),它似乎与没有连接。我修改了我的示例以切换单个缓冲区(类似于your example,但使用AudioBufferSourceNode),并观察到类似的频率下降。但是,当在中间使用GainNode 并将它的gain.value 设置为01 时,频率下降消失了(如果您想创建和连接新的AudioBuffers,这不是解决方案动态)。

    【讨论】:

    • 我创建了一个类似的小提琴,但由于某种原因它在 Chrome 中无法正常工作。请参阅 jsfiddle.net/ashercoren/98LoLtep 的小提琴,以及我在 bugs.chromium.org/p/chromium/issues/detail?id=638823 为 Chrome 打开的错误
    • @Asher 这听起来确实不对。我尝试了各种方法,唯一“修复”它的不是使用Audio 元素。似乎与OscillatorNode 相关,因为这个问题在我的演示中不存在 - 我会进一步调查。此外,根据the Audio Output API spec,您应该能够为 AudioContext 构造函数指定接收器 ID - 我无法让它在 Chrome 51 for Linux 上工作。回家后我会在 52 号考试。
    • 还有另一种解决该错误的方法,将一个空的 AudioBufferSourceNode 连接到沿 OscillatorNode 旁边的增益节点。我不知道为什么,在大多数情况下,这样做的声音是正确的。在音频上下文中重新分级接收器 ID,它尚未在 Chrome 或任何其他浏览器中实现。
    • 另外,我编辑了问题以反映我在使用 Chrome 时遇到的问题
    • @Asher:我认为它与节省流带宽(或其他一些流信号机制)有关,当没有任何连接或它的增益设置为 0 线路上的某处,并且没有在连接某些东西或设置增益 > 0 时正确恢复(即使流实际上并未通过网络发送)。但这纯粹是猜测——我不知道任何内部情况。 Downvoter:愿意解释为什么?最初的问题得到了回答。评论中描述的问题似乎是一个错误,它不会使答案不正确。至少解释一下应该改进的地方。
    猜你喜欢
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    相关资源
    最近更新 更多