Вот ландшафт: мне нужно взять Float32Array
, представляющий канал из буфера, и скопировать его в новый AudioBuffer
.Метод copyToChannel
в буфере недоступен в этих браузерах, хотя MDN утверждает, что так и должно быть.Приложение не работает с этим методом undefined
.
Так что я попробовал то, что делает этот пример для копирования данных из одного массива канала в другой.Но это приводит к SyntaxError: The string did not match the expected pattern
на конструкторе OfflineAudioContext
, который используется внутри пакета audio-resampler для сэмплирования звука.Опять же, все это происходит только с 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)
})
})
Я нашел этот ответ и попробовал: _buffer.getChannelData(0).set(buffers[0])
.Результатом стал тот же SyntaxError, что и выше.
Наконец, я нашел этот тест webkit .txt , который, похоже, предполагает, что SyntaxError выбрасывается, когда 0 передается конструктору OfflineAudioContext.Я проверил параметры прямо перед конструктором, и они все ненулевые