发布音频缓冲区Web音频API
问题描述:
我正在使用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();
};
答
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是垃圾收集的,您应该在完成使用后将其从该声音地图中移除。
你能否显示你的代码(如果可能,匿名),以便有人可以给你一个特定的答案? – 2014-10-10 07:59:35
+1。我不能说,但我希望你的问题是你坚持缓冲区对象,而不是释放它们(在这种情况下,正常的垃圾收集应该摆脱它们)。 – cwilso 2014-10-10 16:27:40