22

var audio = new Audio("click.ogg")

我在需要时播放咔哒声

audio.play()

但是,有时用户速度如此之快,以至于浏览器根本不播放音频(可能还在播放之前的play请求时)。这个问题与预加载有关吗?

如何强制浏览器停止播放并重新开始?没有stop,只是pause在 HTML5 音频组件中,对吗?这里可以使用什么解决方法?


更新- 附加说明:

我有多个div带有touchend事件的类似复选框的元素。当此类事件被触发时,元素会在视觉上发生变化,会播放声音并相应地设置内部变量。如果用户慢慢点击这些元素,一切都会很好。如果快速敲击,声音通常会被完全跳过......

4

4 回答 4

49

你可以试试这段代码:

audio.currentTime = 0;
audio.play();

看起来这是最简单的解决方案。

于 2014-04-03T12:30:58.960 回答
9

这是我一直在使用的代码,它对我有用:

            if(audioSupport.duration > 0 && !audioSupport.paused){

                //already playing
                audioSupport.pause();
                audioSupport.currentTime = 0;
                audioSupport.play();

            }else{

                //not playing

                audioSupport.play();    

            }
于 2013-04-15T09:54:52.373 回答
1

我注意到在 Firefox 上,一次又一次地快速播放声音(如短促的滴答声)会经常跳过节拍。我得到的最佳解决方案就是以cloneNode这种方式简单地调用和播放每个声音。它并不完美(与听起来完美无瑕的 Chrome 相比):

var audio = document.getElementById('myaudio');
setInterval(function() {
    audio.cloneNode().play();
}, 100);
于 2020-03-07T00:30:20.457 回答
-1

我发现如何快速播放短声音的唯一方法(如此之快以至于第二个声音在第一个结束之前开始)是实际加载 5 或 10,如果您必须再次播放但已经在播放,只需转到下一个,没有播放:

    var soundEls = [];//load 10 audios instead of 1
    for(var i=0;i<10;i++){
        var soundEl = document.createElement('audio');
        soundEl.src = url;
        soundEl.preload = 'auto';
        $(this._soundEl).append(soundEl);
        soundEls.push(soundEl);
    }

    var soundElIndex = 0;

    return {play:function(){
        var soundEl = soundEls[soundElIndex];

        if(soundEl.duration > 0 && !soundEl.paused){

            //already playing, switch to next soundEl
            soundElIndex++;
            if(!soundEls[soundElIndex]) soundElIndex=0;
            soundEls[soundElIndex].play();

        }else{

            //not playing
            soundEl.play();    

        }

    }};

这样做的结果是您实际上可以在其自身上播放相同的声音。

可能不是正确的方法。

于 2013-06-02T15:52:05.343 回答