首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AudioContext问题与狩猎

AudioContext问题与狩猎
EN

Stack Overflow用户
提问于 2015-09-14 11:09:48
回答 1查看 1K关注 0票数 2

我使用AudioContext在我的网站上播放一些音频。它在Chrome和Firefox上运行得很好,但在Safari上就不行了。在Safari上,stop函数不起作用,我得到以下信息:

Error InvalidStateError: DOM 11:尝试使用一个不再可用或不再可用的对象。noteOff (preload.js,第85行)

有人知道如何修复这个问题吗?为什么会出现这个错误呢?

代码语言:javascript
运行
复制
function _initWebAudio(AudioContext, format, audios, callback) {

    var context = new AudioContext();
    preloader(audios, _preload, callback);

    function _preload(asset, doneCallback) {
        var request = new XMLHttpRequest();
        request.open('GET', 'audio/' + asset.id + '.' + format, true);
        request.responseType = 'arraybuffer';
        request.onload = function () {
        context.decodeAudioData(request.response, function (buffer) {
            var source;
            // default volume
            //// support both webkitAudioContext or standard AudioContext
            asset.gain = context.createGain ? context.createGain() : context.createGainNode();
            asset.play = function () {
                source = context.createBufferSource(); // creates a sound source
                source.buffer = buffer; // tell the source which sound to play
                source.connect(asset.gain); // connect the source to the context's destination (the speakers)
                asset.gain.connect(context.destination);
                // play the source now
                // support both webkitAudioContext or standard AudioContext
                source.noteOn ? source.noteOn(0) : source.start(0);
            };
            asset.stop = function () {
                console.log(source);
                source = context.createBufferSource(); // creates a sound source
                source.noteOff ? source.noteOff(0) : source.stop(0);
            }
            asset.toggleVolume = function (muteSound) {
                if (muteSound) {
                    asset.gain.gain.value = 0;
                } else {
                    asset.gain.gain.value = 1;
                }
            }
            doneCallback();
        }, function (err) {
            asset.play = function () {
            };
            doneCallback(err, asset.id);
        });
    };
    request.onerror = function (err) {
        console.log(err);
        asset.play = function () {
        };
        doneCallback(err, asset.id);
    };
        // kick off load
        request.send();
    }
}
EN

回答 1

Stack Overflow用户

发布于 2015-09-14 12:40:03

我不知道为什么会发生这种情况,但我使用disconnect()方法解决了这个问题。

代码语言:javascript
运行
复制
asset.stop = function () {
   asset.gain.disconnect();
   //source.noteOff ? source.noteOff(0) : source.stop(0);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32563298

复制
相关文章

相似问题

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