2014-10-10 131 views
0

我正在使用WEB音频API为Webapp呈现音频信号。但是,我遇到了一个问题,每秒钟都要加载一个音频文件,Chrome使用的RAM越来越多,我不知道如何释放我不再需要的缓冲区/声音。发布音频缓冲区Web音频API

有没有什么办法解决我的问题从我的JavaScript程序或更改铬合作伙伴?

我的代码:

loadSounds(this, { 
    buffer: this.url 
}); 

function loadSounds(obj, soundMap, callback) { 
    // Array-ify 
    var names = []; 
    var paths = []; 

    for (var name in soundMap) { 
     var path = soundMap[name]; 
     names.push(name); 
     paths.push(path); 
    } 

    bufferLoader = new BufferLoader(context, paths, function(bufferList) { 
     for (var i = 0; i < bufferList.length; i++) { 
      var buffer = bufferList[i]; 
      var name = names[i]; 
      obj[name] = buffer; 
     } 
     if (callback) { 
      callback(); 
     } 
    }); 
    bufferLoader.load(); 
} 
function BufferLoader(context, urlList, callback) { 
    this.context = context; 
    this.urlList = urlList; 
    this.onload = callback; 
    this.bufferList = bufferListG; 
    this.loadCount = 0; 
} 
BufferLoader.prototype.load = function() { 
    for (var i = 0; i < this.urlList.length; ++i) 
     this.loadBuffer(this.urlList[i], i); 
}; 
BufferLoader.prototype.loadBuffer = function(url, index) { 
    // Load buffer asynchronously 
    var request = new XMLHttpRequest(); 
    request.open("GET", url, true); 
    request.responseType = "arraybuffer"; 

    var loader = this; 

    request.onload = function() { 
     // Asynchronously decode the audio file data in request.response 
     loader.context.decodeAudioData(
      request.response, 
      function(buffer) { 
       if (!buffer) { 
        alert('error decoding file data: ' + url); 
        return; 
       } 
       loader.bufferList[index] = buffer; 
       if (++loader.loadCount == loader.urlList.length) 
        loader.onload(loader.bufferList); 
      }, 
      function(error) { 
       console.error('decodeAudioData error', error); 
      } 
     ); 
    } 

    request.onerror = function() { 
     alert('BufferLoader: XHR error'); 
    } 

    request.send(); 
}; 
+0

你能否显示你的代码(如果可能,匿名),以便有人可以给你一个特定的答案? – 2014-10-10 07:59:35

+2

+1。我不能说,但我希望你的问题是你坚持缓冲区对象,而不是释放它们(在这种情况下,正常的垃圾收集应该摆脱它们)。 – cwilso 2014-10-10 16:27:40

回答

0

loader.context.decodeAudioData(
 
    request.response, 
 
    function(buffer) { 
 
    if (!buffer) { 
 
     alert('error decoding file data: ' + url); 
 
     return; 
 
    } 
 
    loader.bufferList[index] = buffer; 
 
    if (++loader.loadCount == loader.urlList.length) 
 
     loader.onload(loader.bufferList); 
 
    }, 
 
    function(error) { 
 
    console.error('decodeAudioData error', error); 
 
    } 
 
);

在从代码中提取上面这段代码,你会看到每次解码音频的时候,你会得到一个新的AudioBuffer要添加到此数组的对象loader.bufferList[index] = buffer;随后将该缓冲区分配给以URL为关键字的Map。 obj[name] = buffer;

虽然数组仍然保存对AudioBuffer对象的引用,但它不会被垃圾收集。这些AudioBuffers实际上相当大,因为它们保存了解码后的音频。因此你会看到大量的内存被耗尽。

实际XHR响应request.response应该被垃圾收集自动根据你的代码,但他们不会增加太多的内存使用,特别是如果你正在下载压缩文件(MP3等)

为了确保AudioBuffer是垃圾收集的,您应该在完成使用后将其从该声音地图中移除。