Web Audio API - 克隆audioBuffer

Ali*_*hes 4 javascript clone audiobuffer web-audio-api

我有一个deepClone在整个程序中使用的函数,该函数克隆一个对象的所有属性和值并返回克隆的对象(请参见下面的代码)。我现在想audioBuffer在对象中包含 an 并成功将其复制到返回的对象。有没有办法修改函数以包含此功能?

注意:并非所有传递给该deepClone函数的对象都会包含audioBuffer,因此它应该能够处理并成功克隆带有或不带有它们的对象。

编辑:有人能想出一种方法来JSON.parse(JSON.stringify(object))与作为答案之一提供的解决方案相结合吗?即在克隆发生时检查对象的属性,以if (property == 'trackBuffer')与其他对象不同的方式克隆它?

deepClone功能:

function deepClone (object) {
   return JSON.parse(JSON.stringify(object));
};
Run Code Online (Sandbox Code Playgroud)

function deepClone (object) {
   return JSON.parse(JSON.stringify(object));
};
Run Code Online (Sandbox Code Playgroud)

正如您从代码片段中看到的, 的clonedTracktrackBuffer转换为一个空对象,这正是 所期望的JSON.parse(JSON.stringify(object));

deepClone修改以成功克隆但保留现有功能的最佳方法是什么audioBuffer

任何帮助将不胜感激,谢谢!

Eri*_*sen 5

我的建议是,将AudioBuffer序列化(反序列化)作为特殊情况处理会更安全。当您的代码必须跨多个浏览器运行并且面向未来时,您最好使用该对象支持的 API。

function cloneAudioBuffer(fromAudioBuffer) {
  const audioBuffer = new AudioBuffer({
    length:fromAudioBuffer.length, 
    numberOfChannels:fromAudioBuffer.numberOfChannels, 
    sampleRate:fromAudioBuffer.sampleRate
  });
  for(let channelI = 0; channelI < audioBuffer.numberOfChannels; ++channelI) {
    const samples = fromAudioBuffer.getChannelData(channelI);
    audioBuffer.copyToChannel(samples, channelI);
  }
  return audioBuffer;
}
Run Code Online (Sandbox Code Playgroud)