咆哮js暂停/恢复麻烦

时间:2016-08-01 08:37:59

标签: javascript howler.js

我正在使用Howler js库在通过Electron运行的应用中设置播放器。首先,一切似乎都运行良好,但在使用应用程序几周后,反复出现一个错误,但不是经常发生:pause()函数不起作用。这是一段代码:

初始化:

    var is_paused = true;
    var currentTrack = "track1";

    var tracks =    {"track1" :  new Howl({urls: ['path/to/track1.mp3']}),
                    "track2" : new Howl({urls: ['path/to/track2.mp3']}),
                    "track3" : new Howl({urls: ['path/to/track3.mp3']})
    };

然后我有几个按钮用于播放/恢复,暂停,停止和播放特定曲目:

$('#playS').click(function(){
        if (is_paused){
            tracks[currentTrack].play();
            is_paused = false;
        }
    });

$('#pauseS').click(function(){
        tracks[currentTrack].pause();
        is_paused = true;
    });

$('.trackBtn').click(function(){
        tracks[currentTrack].stop(); 
        currentTrack = $(this).attr('id');
        tracks[currentTrack].play();
        is_paused = false;
    });

问题是有时候(通常在播放曲目40-45分钟后),pause()函数什么都不做,这真烦人,因为我需要暂停曲目并再播放30秒的文件然后恢复当前的曲目。当bug发生时我检查了控制台,它什么也没说。我不知道bug来自哪里,关于如何使用库的信息并不多。我真的需要一些帮助,谢谢你提前。

编辑:还有一件事,当pause()不起作用时,如果我点击play()曲目从开始播放,我就可以控制第二个曲目实例。这就像第一个实例已经结束,但仍在播放。

1 个答案:

答案 0 :(得分:0)

在不知道你正在使用什么版本的咆哮,或者其他代码可能搞乱的情况下,我认为有一件事可能会有所帮助:你不需要跟踪暂停状态。 “玩”方法可以解决这个问题。我使用类似的东西使它工作:

// If it's paused, it's not playing, so... paused = !myHowlInstance.playing();

我注意到的另一件事是你的(我认为是a)停止按钮中有currentTrack = $(this).attr('id');。不幸的是,我不太了解JQuery是否有任何问题(我自己更像是一个Dojo粉丝)。但看起来currentTrack可能会设置为不在列表中的某个值(这会打破tracks[currentTrack])。您可能想要进入控制台并输入tracks["track1"]currentTrack等来查看其值。你甚至可以tracks[currentTrack].play();看看会发生什么。我不确定你是否知道你能做到这一点(当我发现它时,它对我来说是一个很大的帮助)。

至于从开头开始的“不停顿”,我现在正在努力解决这个问题;目前没有明确的方法可以做到这一点(没有resume()pause(false)等等),我在Google和SO上看到了关于这个主题的更多问题,所以你并不孤单。我已经尝试了seek方法,但没有运气。如果/当我达成突破时,我会发表评论。 :)

编辑:我想出了从一开始就玩的东西。它确实涉及“寻求”,以及整个“实例ID”概念(我从未真正理解文档的重要性)。

以下是我正在进行的项目(也是游戏)的示例;它不涉及JQuery(对不起),但它应该给你如何解决问题的要点。

var myBgMusic = new Howl(...);
var myMusicID = myBgMusic.play();   // The docs say play() returns an ID, and I'll be passing that to "seek" later.
var paused = false;
var saveSeek;
function TogglePause() {

    if (paused) {
        myBgMusic.play(myMusicID);
        myBgMusic.seek(saveSeek, myMusicID);
    } else {
        myBgMusic.pause();
        saveSeek = myBgMusic.seek(myMusicID);
    }
};