情况如下:我需要从缓冲区中获取一个表示通道的Float32Array
并将其复制到新的AudioBuffer
。缓冲区上的copyToChannel
方法在那些浏览器中不可用,即使MDN认为应该使用。应用程序使用该方法undefined
失败。
因此,我尝试了example的作用,将数据从一个通道阵列复制到另一个通道。但这会导致SyntaxError: The string did not match the expected pattern
构造函数上的OfflineAudioContext
,该构造器在audio-resampler package内用于对音频进行下采样。同样,所有这些仅在Safari 11和Edge中发生。但是我检查了所有进入构造函数的参数,它们是整数。堆栈跟踪的其余部分没有给我任何其他线索。
这是我目前的代码:
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)
})
})
我确实找到了this answer并尝试了:
_buffer.getChannelData(0).set(buffers[0])
。导致与上述相同的SyntaxError。最后,我发现了这个webkit test .txt,这似乎表明将0传递给OfflineAudioContext构造函数时会引发SyntaxError。我在构造函数之前检查了参数,它们都是非零的
最佳答案
OfflineAudioContext
的参数的有效值受到限制。您将必须检查实现以确定限制,但是如果可以使用这些值创建AudioBuffer
,则应该能够使用这些值构造OfflineAudioContext
。如果不是,那是实现中的错误。