将Float32Array复制到Safari和Edge中的新AudioBuffer

时间:2018-05-18 17:52:30

标签: javascript safari microsoft-edge web-audio web-audio-api

这里有景观:我需要从缓冲区中获取代表某个频道的Float32Array并将其复制到新的AudioBuffer。缓冲区上的copyToChannel方法在这些浏览器中不可用,即使MDN说它应该是。该应用程序失败,使用该方法undefined

所以我已经尝试了example将数据从一个通道数组复制到另一个通道数组的功能。但这导致SyntaxError: The string did not match the expected pattern构造函数上的OfflineAudioContext this.audioRecorder.getBuffer((buffers) => { // `buffers` is an array of two Float32Arrays representing each channel // so create a new buffer and and copy the channel data to it to preserve the audio const _buffer = this.audioContext.createBuffer( 1, buffers[0].length, this.audioContext.sampleRate ) // _buffer.copyToChannel(buffers[0], 0, 0) const channelData = _buffer.getChannelData(0) for (let i = 0; i < channelData.length; i++) { channelData[i] = buffers[0][i] } resampler(_buffer, 16000, function(event) { const _buffer = event.getAudioBuffer() const audioData = { sampleRate: _buffer.sampleRate, channelData: [] } if (_buffer.duration > 3.0) reject(constants.messages.sampleLength) for (var i = 0; i < _buffer.numberOfChannels; i++) { audioData.channelData[i] = _buffer.getChannelData(i) } // resolves a promise outside this code resolve(audioData) }) }) audio-resampler package内使用,以对音频进行下采样。所有这一切只发生在Safari 11和Edge上。但我检查了所有进入构造函数的参数,它们是整数。堆栈跟踪的其余部分并没有给我任何其他线索。

这是我现在的代码:

_buffer.getChannelData(0).set(buffers[0])

我找到了this answer并尝试了:imageObj。导致与上面相同的SyntaxError。

最后,我发现这个webkit test .txt似乎表明当一个0传递给OfflineAudioContext构造函数时抛出了SyntaxError。我在构造函数之前检查了参数,它们是 所有非零

1 个答案:

答案 0 :(得分:1)

OfflineAudioContext的参数的有效值存在约束。您必须检查实施以确定限制,但如果您可以使用这些值创建AudioBuffer,那么您应该能够使用这些值构建OfflineAudioContext。如果没有,那就是实施中的一个错误。