Скопируйте Float32Array в новый AudioBuffer в Safari и Edge - PullRequest
0 голосов
/ 18 мая 2018

Вот ландшафт: мне нужно взять 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.Я проверил параметры прямо перед конструктором, и они все ненулевые

1 Ответ

0 голосов
/ 21 мая 2018

Существуют ограничения на допустимые значения параметров OfflineAudioContext.Вам нужно будет проверить реализацию, чтобы определить пределы, но если вы можете создать AudioBuffer с этими значениями, то вы сможете создать OfflineAudioContext с этими значениями.Если нет, то это ошибка в реализации.

...