重播chrome中的Audio元素

时间:2014-02-05 14:57:49

标签: javascript html5 google-chrome audio

sounds["foo"]= new Audio("foo.ogg");
function playSound(id){

var snd = this.sounds[id];

if(snd.currentTime>snd.duration*0.99999){
    snd.pause();
    snd.currentTime=0;
    //snd.seekable.start(); //doesnt work
    //snd.load(); does the trick but with the cost re-downloading the clip every single time
    snd.play();
}
if(snd.currentTime==0)
snd.play();
}

出于某种原因,playSound('foo');第一次工作,但在Chrome之后失败(在Firefox上运行正常)。添加snd.load()似乎解决了这个问题,但现在每次播放剪辑时都会从服务器下载剪辑,这在我的用例中很多。

编辑:哦,snd.currentTime似乎最终陷入困境,所以snd.currentTime = 0什么都不做。

1 个答案:

答案 0 :(得分:0)

以下脚本适用于OSX,Chrome版本32.0.1700.102和Firefox 27.0。

如果您不想立即循环文件,那么您的脚本肯定是正确的方法。

我无法重现您的问题。我将该方法与链接上的onclick操作相关联,并使用5s .ogg文件进行测试。单击链接并重新播放音频文件一直对我有用。 我注意到唯一可能的问题是你的第二个if子句。如果匹配第一个if,则将时间设置为0并播放文件。即使在我看来这不太可能,也可能是第二个if也匹配,snd.play()第二次被调用。因此,我会使用if。

你能试一试吗?即使我认为它无法解决您的问题:/

<script type="text/javascript">
    var sounds = [];
    sounds["foo"]= new Audio("foo.ogg");

    /* First solution, creating a loop */
    function playSoundLoop(id){
        var snd = this.sounds[id];  
        snd.play();
        snd.addEventListener('ended', function(){
            this.currentTime = 0;
            this.play();
            }, false);
    }

    /* Use else if instead of if */
    function playSound(id){
        var snd = this.sounds[id];

        if(snd.currentTime>snd.duration*0.99999){
            snd.pause();
            snd.currentTime=0;
            snd.play();
        } else if(snd.currentTime==0) {
            snd.play();
        }
    }
</script>