我有一个应用程序,可以播放不同的代码生成的声音。我将这些声音放在Audio中,允许用户选择播放声音的输出设备,因此我使用MediaStreamAudioDestinationNode,其流用作AudioBufferSourceNode.元素的源。这样,当用户选择要播放声音的音频输出时,我将audio元素的Sink Id设置为请求的音频输出。
所以我有AudioBufferSourceNode ->一些音频图形(增益节点等) -> MediaStreamAudioDestinationNode ->音频元素。
当我播放第一个声音时,它听起来很好。但是,当我创建一个新的信号源并将其连接到相同的MediaStreamAudioDestinationNode时,声音以错误的音高播放。
我创建了显示该问题的a Fiddle。
这是一个bug,还是我做错了什么?
发布于 2016-08-18 17:45:46
使用.connect() and .disconnect()可以动态更改图形布局,即使音频正在播放或通过流发送(甚至可以通过WebRTC流传输)。我找不到参考in the spec,所以我很确定这是理所当然的。
例如,如果您有两个AudioBufferSourceNodes bufferSource1和bufferSource2,以及一个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中找到它。
当前解决方法:
我使用了您的变通方法(使用MediaStreamAudioDestinationNode和Audio对象),它似乎与没有任何连接有关。我修改了我的示例以切换单个缓冲区(类似于your example,但使用了AudioBufferSourceNode),并观察到类似的频率下降。但是,当在中间使用GainNode并将它的gain.value设置为0或1时,频率下降就消失了(如果您想动态创建和连接新的AudioBuffer,这不是解决方案)。
https://stackoverflow.com/questions/38973666
复制相似问题