我正在使用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()
曲目从开始播放,我就可以控制第二个曲目实例。这就像第一个实例已经结束,但仍在播放。
答案 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);
}
};