首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >网络音频API -克隆一个audioBuffer

网络音频API -克隆一个audioBuffer
EN

Stack Overflow用户
提问于 2017-04-27 11:04:20
回答 2查看 1.3K关注 0票数 3

我在整个程序中使用了一个deepClone函数,它克隆一个对象的所有属性和值并返回克隆的对象(参见下面的代码)。现在,我希望在对象中包含一个audioBuffer,并成功地将其复制到返回的对象。是否有一种方法可以修改函数以包含此功能?

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

JSON.parse(JSON.stringify(object))编辑:有人能想出一种将和解决方案结合起来的方法吗?也就是说,在克隆发生时检查对象的属性, 克隆对象与其他对象不同?

deepClone函数:

代码语言:javascript
复制
function deepClone (object) {
   return JSON.parse(JSON.stringify(object));
};

代码语言:javascript
复制
/**
 * Utility function for deep object cloning
 *                                                                                                                                                                               
 * @param   {object} obj  Object to be cloned
 * @returns {object}      The deep-cloned object
 */
function deepClone (object) {
    return JSON.parse(JSON.stringify(object));
};

// Create audio context
var context = new AudioContext(); 

// Create empty audio buffer
var audioBuffer = context.createBuffer(2, 22050, 44100); 

// Create object to be cloned
var track = {
  prop1: "val1",
  prop2: "val2",
  trackBuffer: audioBuffer
};

// Log before clone
console.log("before clone, track:  \n", track);

// Clone track
var clonedTrack = deepClone(track);

// Log after clone
console.log("after clone, clonedTrack: \n", clonedTrack);

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

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

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

EN

回答 2

Stack Overflow用户

发布于 2022-05-10 00:40:23

我的建议是,将AudioBuffer (反序列化)作为特例处理更安全。当您的代码必须跨多个浏览器工作并且具有未来的安全性时,最好使用对象的受支持的API。

代码语言:javascript
复制
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;
}
票数 3
EN

Stack Overflow用户

发布于 2017-04-27 11:09:40

我认为下面的代码对于克隆对象是有用的。

代码语言:javascript
复制
function clone(obj) {
    if (null == obj || "object" != typeof obj) return obj;
    var copy = obj.constructor();
    for (var attr in obj) {
        if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];
    }
    return copy;
}

请注意,下面的链接给出了有说明的答案。How do I correctly clone a JavaScript object?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43655953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档