簡體   English   中英

發布音頻緩沖區Web音頻API

[英]Release audio Buffer Web Audio API

我正在使用Web應用程序的WEB音頻API來呈現音頻信號。 但是,我有一個問題,每秒加載一個音頻文件,chrome使用越來越多的RAM,而且我不知道如何釋放不再需要的緩沖區/聲音。

有什么辦法可以解決我的JavaScript程序問題或更改chrome屬性嗎?

我的代碼:

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對象的引用,但不會進行垃圾回收。 這些AudioBuffer實際上非常大,因為它們保存解碼的音頻。 因此,您會看到大量的內存已用完。

實際的XHR響應request.response應該根據您的代碼自動進行垃圾回收,但是它們並不會增加內存使用量,尤其是當您下載壓縮文件(mp3等)時

為了確保AudioBuffer被垃圾回收,在使用完它們后,應將其從該聲音映射中刪除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM