如何检查音频文件是否已加载SoundJS?

时间:2014-08-13 13:49:14

标签: javascript audio

我试图使用SoundJS动态加载声音。

如果我注册了已经注册createjs.Sound.registerSound的声音,我就不会加载回调函数(由" fileload"事件监听器调用)。

createjs.Sound.addEventListener("fileload", createjs.proxy(this.loadHandler, this));
createjs.Sound.registerSound(url, "song");

根据帖子hereSoundJS documentation,我可以检查声音是否已加载loadComplete(url)

但是这个:

createjs.Sound.loadComplete("audio/file.mp3")

...返回:

Uncaught TypeError: Cannot read property 'mp3' of null

问题似乎是以下函数返回null,因为activePlugin为null。为什么在音频正常播放时会发生这种情况(我在Mac上的Chrome上进行测试)?不应该使用默认的WebAudioPlugin或HTMLAudioPlugin吗?

来自 soundjs-0.5.2.combined.js

s.getCapabilities = function () {
    if (s.activePlugin == null) {
        return null;
    }
    return s.activePlugin._capabilities;
};

更新

这是一个临时的解决方法,很难看,但很有效。

我解决了两件事:

1)在使用createjs.Sound.loadComplete(url)之前,我首先检查createjs.Sound.activePlugin是否为真。

2)为了处理尚未加载的音频文件,我在 SoundJS.loadComplete()函数中添加了一个条件来检查是否s._preloadHash[src] === undefined,如果是,则返回false(这意味着那个URL)没有注册的网址会返回false,就像文件没有被加载一样):

s.loadComplete = function (src) {
    var details = s._parsePath(src);
    if (details) {
        src = s._getSrcById(details.src).src;
    } else {
        src = s._getSrcById(src).src;
    }

    // song has not been registered. return false
    if (s._preloadHash[src] === undefined)
        return false;

    return (s._preloadHash[src][0] == true);  // src only loads once, so if it's true for the first it's true for all
};

...在另一个JavaScript文件中:

loadSong: function(url){            
    currentSongURL = url;

    // if Sound.activePlugin returns false, load the song.
    if (!createjs.Sound.activePlugin){
        createjs.Sound.addEventListener("fileload", createjs.proxy(this.loadHandler, this));
        createjs.Sound.registerSound(url, url); // url, id
        return;
    }

    // if song is already loaded, resolve deferred.
    if(createjs.Sound.loadComplete(url)) {
        songDeferred.resolve(); 
    }else{
        createjs.Sound.addEventListener("fileload", createjs.proxy(this.loadHandler, this));
        createjs.Sound.registerSound(url, url); // url, id
    }

},

我正在研究如何在不弄乱SoundJS类的情况下扩展SoundJS.loadComplete(),以及如何避免上面loadSong()函数上重复的代码。它确实看起来非常混乱,但这就是我现在所拥有的,使它按照我打算的方式工作。任何有关这方面的帮助都将深受赞赏。

0 个答案:

没有答案