3

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

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

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

我创建了一个显示问题的小提琴。

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

4

1 回答 1

-1

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

例如,如果您有两个 AudioBufferSourceNodesbufferSource1bufferSource2,以及一个 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);

实例在行动


编辑1:

正确实施:

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

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

当前解决方法:

我玩弄了你的解决方法(使用一个MediaStreamAudioDestinationNodeAudio对象),它似乎与没有连接。我修改了我的示例以切换单个缓冲区(类似于您的示例,但使用AudioBufferSourceNode),并观察到类似的频率下降。但是,当使用GainNodeinbetween 并将其设置gain.value0or时,频率下降消失了(如果您想动态创建和连接 new s 1,这不是解决方案)。AudioBuffer

于 2016-08-18T09:45:46.010 回答