当前位置:  开发笔记 > 编程语言 > 正文

在Javascript中预加载音频的问题

如何解决《在Javascript中预加载音频的问题》经验,为你挑选了1个好方法。

我正在尝试为我正在开发的GameAPI制作跨设备/浏览器图像和音频预加载方案.音频文件将预加载,并在完成后发出回调.

问题是,音频不会在慢速页面加载时开始加载,但通常会在第二次尝试时起作用,可能是因为它缓存了它并且知道它存在.

我把它缩小到了audio.load()函数.摆脱它解决了这个问题,但有趣的是,我的摩托罗拉机器人需要这个功能.

您对HTML5音频预加载有哪些经验?

这是我的代码.是的,我知道在单独的功能中加载图像可能会导致竞争条件:)

var resourcesLoading = 0;

function loadImage(imgSrc) {
    //alert("Starting to load an image");
    resourcesLoading++;

    var image = new Image();
    image.src = imgSrc;

    image.onload = function() {
        //CODE GOES HERE
        //alert("A image has been loaded");
        resourcesLoading--;
        onResourceLoad();
    }
}

function loadSound(soundSrc) {
    //alert("Starting to load a sound");
    resourcesLoading++;

    var loaded = false;

    //var soundFile = document.createElement("audio");
    var soundFile = document.createElement("audio");
    console.log(soundFile);
    soundFile.autoplay = false;
    soundFile.preload = false;

    var src = document.createElement("source");
    src.src = soundSrc + ".mp3";
    soundFile.appendChild(src);

    function onLoad() {
        loaded = true;

        soundFile.removeEventListener("canplaythrough", onLoad, true);
        soundFile.removeEventListener("error", onError, true);

        //CODE GOES HERE
        //alert("A sound has been loaded");
        resourcesLoading--;
        onResourceLoad();
    }

    //Attempt to reload the resource 5 times
    var retrys = 4;

    function onError(e) {
        retrys--;

        if(retrys > 0) {
            soundFile.load();
        } else {
            loaded = true;

            soundFile.removeEventListener("canplaythrough", onLoad, true);
            soundFile.removeEventListener("error", onError, true);

            alert("A sound has failed to loaded");
            resourcesLoading--;
            onResourceLoad();
        }
    }

    soundFile.addEventListener("canplaythrough", onLoad, true);
    soundFile.addEventListener("error", onError, true);
}

function onResourceLoad() {
    if(resourcesLoading == 0)
        onLoaded();
}

诊断问题很难,因为它没有显示错误,只是偶尔失败.



1> Jeffrey Swee..:

我搞定了.解决方案实际上相当简单:

基本上,它的工作原理如下:

channel.load();
channel.volume = 0.00000001;
channel.play();

如果不是很明显,该load函数告诉浏览器和支持它开始加载设备,然后声音会立即尝试playvolume几乎为零.因此,如果load功能不够,"需要"播放声音的事实足以触发我测试的所有设备的负载.

load功能现在可能实际上是多余的,但基于音频实现的不一致性,它可能没有什么坏处.

编辑:在Opera,Safari,Firefox和Chrome上测试后,看起来设置volume为0仍然会预加载资源.

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有