- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 JavaScript Web Audio API AudioContext 来播放音频。它可以与其他主要浏览器配合使用,但 MacOS 上的 Safari 在调用 webkitAudioContext.createBuffer API 时会引发 NotSupportedError 异常。我发现这个问题,Play PCM with javascript ,在页面末尾还指出 Safari 存在此类问题。因此,我从那里调试了“工作示例 https://o.lgm.cl/example.html(16 位 LSB)”,并在 Safari 中遇到了同样的问题。
由于我还是 StackOverflow 的新手,因此我无法向该问题添加评论,询问他们如何解决此问题。那么,有人可以帮忙吗?非常感谢!
在 Safari 的 JavaScript 控制台中运行以下两行代码将重现该问题:
var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
var myAudioBuffer = audioCtx.createBuffer(1, 48000, 16000);
> NotSupportedError: The operation is not supported.
最佳答案
您收到的错误几乎是预料之中的。 Web Audio 规范规定,如果 SampleRate 超出支持的范围,则必须抛出 NotSupportedError。但它也表示支持的最低采样率应至少为 8000 Hz。
https://webaudio.github.io/web-audio-api/#dom-baseaudiocontext-createbuffer
Safari 的 Web Audio 实现仅支持 22050 Hz 及以上的 AudioBuffer。因此,我建议创建一个 32000 Hz 的 AudioBuffer,因为 32 是 16 的倍数,这使得下一步更容易推理。
填充缓冲区时,您需要通过自己插入缺失值来补偿较大的sampleRate。我认为基本的线性插值应该工作得相当好。但您也可以使用 OfflineAudioContext 来重新采样您的 AudioBuffer。
在完美的世界中(例如 Firefox、Chrome 或 Opera),您可以像这样重新采样 AudioBuffer:
// Let's assume you have an AudioBuffer called audioBuffer of 1 second at 16 kHz.
const offlineAudioContext = new OfflineAudioContext(
{ length: 32000, sampleRate: 32000 }
);
const audioBufferSourceNode = new AudioBufferSourceNode(
offlineAudioContext,
{ buffer: audioBuffer }
);
audioBufferSourceNode.start(0);
audioBufferSourceNode.connect(offlineAudioContext.destination);
const resampledAudioBuffer = await offlineAudioContext.startRendering();
变量resampledAudioBuffer
现在将引用32 kHz的重新采样的AudioBuffer。
但是 Safari 中 Web Audio API 的实现已经过时且存在错误。它不仅不支持创建小于22050 Hz的AudioBuffer,也无法创建小于44100 Hz的OfflineAudioContext。
但是,您的用例所需的只是将数据重新采样两倍。理论上从 16 kHz 到 32 kHz 或从 44100 Hz 到 88200 Hz 重采样是一样的。
因此,您可以创建一个 44100 Hz 的 AudioBuffer,并用实际上 16 kHz 的数据填充它。然后将该缓冲区重新采样到 88200 Hz。生成的数据将成为 32 kHz 的原始数据。
这一切都非常复杂,但不幸的是我不知道在 Safari 中还有其他方法可以做到这一点。
为了避免使用 Safari 仍然需要的过时语法,我建议使用 polyfill。我是 standardized-audio-context 的作者这就是为什么我会推荐这样做,但它不是唯一的。
关于javascript - Safari webkitAudioContext.createBuffer API 引发 NotSupportedError 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54620363/
我正在使用 Chrome 网络音频 API 和 webkitAudioContext 来播放循环。我有几个循环,我在它们之间交叉淡入淡出,类似于 Digital DJ Chrome 博客上的例子。 在
我在使用 Google Closure javascript 编写的应用程序中使用了 webkitAudioContext 构造函数,它是 webkit 浏览器的原生构造函数。 在高级模式下使用 Pl
我想在 iPhone 上进行现场声音分析。为此我使用webkitAudioContext 分析器。 var ctx = new (window.AudioContext || window.webki
我正在使用 JavaScript Web Audio API AudioContext 来播放音频。它可以与其他主要浏览器配合使用,但 MacOS 上的 Safari 在调用 webkitAudioC
我是一名优秀的程序员,十分优秀!