我正在使用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控制台中运行这两行代码将重现该问题:
var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
var myAudioBuffer = audioCtx.createBuffer(1, 48000, 16000);
> NotSupportedError: The operation is not supported.发布于 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进行重采样:
// 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的作者,这就是为什么我会推荐它,但它不是唯一的。
https://stackoverflow.com/questions/54620363
复制相似问题