javascript - AudioBufferSourceNode:索引或大小为负数或大于允许的量
问题描述
我正在关注有关 WebAudio API的教程,但我想使用一个AudioBufferSourceNode
(来调整播放速率)而不是增益节点。
但是将轨道连接到会AudioBufferSourceNode
引发错误消息并抱怨:
IndexSizeError: Index or size is negative or greater than the allowed amount
这是我的代码:
const audioContext = new AudioContext();
const audioElement = document.querySelector('audio');
const track = audioContext.createMediaElementSource(audioElement);
const bufferNode = new AudioBufferSourceNode(audioContext, { playbackRate: 0.9 });
track.connect(bufferNode).connect(audioContext.destination);
HTML 包含此脚本和带有示例音频的音频标签。我也基于教程中的文件,您可以在此处在线找到它们的存储库。
解决方案
你得到的错误被抛出,因为 anAudioBufferSourceNode
只有一个输出。它不接受任何输入。这意味着下面的伪代码总是会抛出错误。
someAudioNode.connect(anAudioBufferSourceNode);
AnAudioBufferSourceNode
期望得到一个AudioBuffer
可以被认为是它的输入的。
解决您的问题的一种方法是加载您预先使用的文件src
,AudioElement
对其进行解码,decodeAudioData()
然后将结果AudioBuffer
与AudioBufferSourceNode
.
或者您根本无法使用 Web Audio API,而是使用playbackRate
AudioElement 的属性来调整播放速率。
第一个解决方案的缺点是您需要预先下载整个文件。与此相反,第二种解决方案不太准确。例如,不可能自动化playbackRate
of ,AudioElement
而可以使用playbackRate
of来完成AudioBufferSourceNode
。
推荐阅读
- sql-server - 保持两个不同的数据库同步
- c# - 如何使用 C# 更新多个 div 内容?
- excel - Excel:在取决于另一列中的重复值的范围内查找平均值
- html - 如何使用 express.js 框架将数据发送到 HTML 页面以及如何在 NodeJS 服务器中使用 AJAX 进行单页应用程序?
- python - 如何在 python 中解决这个我几天都无法解决的 Array 任务?
- node.js - 使用 Sequelize 获取数据库列注释
- c - 如何按特定顺序设置位域并稍后检查该顺序
- c# - 如果它来自不同的按钮事件,如何强制编译器不考虑任何代码块
- ios - 在向上滚动更改 tableview 标题
- magento2 - Mage2 :传递给 Magento\Paypal\Model\Adminhtml\Express::isOrderAuthorizationAllowed() 的参数 1 必须是 Magento\Sales\Model\Order\Payment 的实例