gpt4 book ai didi

javascript - Safari webkitAudioContext.createBuffer API 引发 NotSupportedError 异常

转载 作者:行者123 更新时间:2023-12-03 00:13:26 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com