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

Javascript 将Float32Array复制到Safari和Edge中的新AudioBuffer,javascript,safari,microsoft-edge,web-audio-api,Javascript,Safari,Microsoft Edge,Web Audio Api,这里是场景:我需要从缓冲区获取一个表示通道的Float32Array,并将其复制到一个新的AudioBuffer。缓冲区上的copyToChannel方法在这些浏览器中不可用,即使MDN说应该可用。应用程序因该方法未定义而失败 所以我尝试了如何将数据从一个通道阵列复制到另一个通道阵列。但这会导致SyntaxError:字符串与OfflineAudioContext构造函数中用于向下采样音频的预期模式不匹配。同样,所有这些只发生在Safari 11和Edge上。但是我检查了所有进入构造函数的参数,

这里是场景:我需要从缓冲区获取一个表示通道的
Float32Array
,并将其复制到一个新的
AudioBuffer
。缓冲区上的
copyToChannel
方法在这些浏览器中不可用,即使MDN说应该可用。应用程序因该方法
未定义
而失败

所以我尝试了如何将数据从一个通道阵列复制到另一个通道阵列。但这会导致
SyntaxError:字符串与
OfflineAudioContext
构造函数中用于向下采样音频的预期模式不匹配。同样,所有这些只发生在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.audioRecorder.getBuffer((buffers)=>{
//'buffers'是一个由两个代表每个通道的数组组成的数组
//因此,创建一个新的缓冲区,并将通道数据复制到其中以保留音频
const\u buffer=this.audioContext.createBuffer(
1.
缓冲区[0]。长度,
this.audioContext.sampleRate
)
//_buffer.copyToChannel(缓冲区[0],0,0)
const channelData=\u buffer.getChannelData(0)
for(设i=0;i3.0)拒绝(constants.messages.sampleLength)
对于(变量i=0;i<\u buffer.numberOfChannels;i++){
audioData.channelData[i]=\u buffer.getChannelData(i)
}
//解析此代码之外的承诺
解析(音频数据)
})
})
我确实找到并尝试了:
\u buffer.getChannelData(0.set)(buffers[0])
。导致与上述相同的语法错误


最后,我发现这似乎表明当0传递给OfflineAudioContext构造函数时会抛出SyntaxError。我在构造函数之前检查了参数,它们都是非零的对
OfflineAudioContext的参数的有效值有限制。您必须检查实现以确定限制,但如果您可以使用这些值创建
音频缓冲区
,则应该能够使用这些值构建
OfflineAudioContext
。如果不是,那就是实现中的一个bug。

在Raymond的帮助下,我发现我试图创建一个采样率超出Safari限制的缓冲区。我确实也发现了一只虫子。使用
AudioContext
创建缓冲区可接受低至22.05 kHz的采样率,而使用
OfflineAudioContext
则不接受低于44.1 kHz的采样率。Edge的问题最终与web音频无关,而是在该浏览器中使用了不受支持的
新文件
构造函数。