情况如下:我需要从缓冲区中获取一个表示通道的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。如果不是,那是实现中的错误。

09-11 07:22