首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Safari webkitAudioContext.createBuffer API引发NotSupportedError异常

Safari webkitAudioContext.createBuffer API引发NotSupportedError异常
EN

Stack Overflow用户
提问于 2019-02-11 03:53:01
回答 1查看 1.3K关注 0票数 0

我正在使用JavaScript Web audio API AudioContext来播放音频。它在其他主要浏览器上工作得很好,但是MacOS上的Safari在调用webkitAudioContext.createBuffer应用程序接口时会引发NotSupportedError异常。我发现了这个问题,Play PCM with javascript在页面末尾也指出了Safari存在这样的问题。因此,我从那里调试了“工作示例https://o.lgm.cl/example.html (16位LSB)”,并在Safari上遇到了同样的问题。

由于我还是StackOverflow的新手,我不能对这个问题添加评论,询问他们是如何解决这个问题的。有没有人能帮帮忙?非常感谢!

编辑:

在Safari的JavaScript控制台中运行这两行代码将重现该问题:

代码语言:javascript
复制
var audioCtx = new (window.AudioContext || window.webkitAudioContext)(); 
var myAudioBuffer = audioCtx.createBuffer(1, 48000, 16000); 

> NotSupportedError: The operation is not supported.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-13 18:27:46

你得到的错误几乎是预料之中的。网络音频规范规定,如果sampleRate超出支持的范围,则必须抛出NotSupportedError。但它也表示,支持的最低sampleRate应至少为8000 Hz。

https://webaudio.github.io/web-audio-api/#dom-baseaudiocontext-createbuffer

Safari的Web Audio实现只支持22050 Hz以上的AudioBuffers。因此,我建议创建一个32000 Hz的AudioBuffer,因为32是16的倍数,这使得下一步更容易理解。

在填充缓冲区时,您需要通过自己插入缺少的值来补偿较大的sampleRate。我认为基本的线性插值应该工作得相当好。但您也可以使用OfflineAudioContext对AudioBuffer进行重采样。

在完美的世界中(例如火狐、Chrome或Opera),你可以像这样对AudioBuffer进行重采样:

代码语言:javascript
复制
// 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的AudioBuffers,也不支持创建低于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的作者,这就是为什么我会推荐它,但它不是唯一的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54620363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档