我有一个用soundmanager 2播放音乐的功能,当按下按钮加载下一个声音时该功能正常工作但是当我尝试通过onfinish
功能执行此功能时它不起作用,这意味着什么时候音乐播放完毕它不会加载下一个声音我怎么能让它工作,请看下面的代码。
function playSong(id) {
//Stop the sound from playing
soundManager.destroySound(mySound);
//If we're under, just go to the end!
if (id < 0)
id = songs.length - 1;
//If we're over, choose what to do via the repeat flag
if (id >= songs.length)
id = 0;
//Save some variables
playingSongId = id;
playingSong = songs[playingSongId];
track = playingSong.artist_name + " " + "-" + " " + playingSong.track_name;
//Create the sound and begin playing whenever!
soundManager.createSound({
id: mySound,
url: playingSong.track_url,
multiShotEvents: true,
autoPlay: true,
stream: true,
onplay: function () {
setPlayingInfo(track);
setPauseState(false);
setPlayTime();
},
onfinish: function() {
playNextSong();
/*//We'll only continue if we're shuffling or repeating if we past the end...
if (shuffle == false && (playingSongId + 1 >= songs.length) && repeat == false) {
//No more songs...
setPlayingInfo();
setPauseState(false);
setPlayTime();
playingSong = null;
playingSongId = null;
return;
}
else {
playNextSong();
}*/
},
该功能可以作为下一个声音的标题出现在标题中,但歌曲永远不会播放。最后当我在声音加载时点击第一个声音链接并播放标题时不加载但是如果我点击按钮加载下一个声音则会出现标题。请注意,我通过ajax加载这些声音,因为声音在远程服务器上。
答案 0 :(得分:0)
From SoundManager2's Revision History:
Adobe于2013年2月26日发布的Flash Player 11.6.602.171引入了SM2默认的Flash 8(flashVersion:8)基于API的JS / Flash交互的问题,其中SM2方法从回调中调用,如{{ 1}}不起作用。这主要打破了用于按顺序播放声音,连续加载一系列声音等的方法。 (有关详情,请参阅discussion。)
请注意,这不会影响使用
onfinish()
的情况;但是,SM2默认使用soundManager.setup({ flashVersion: 9})
。具体来说,Flash启动的事件(例如声音整理)会使Flash - &gt; JS调用SM2 API,后者调用用户指定的事件处理程序。如果用户指定的SM2
flashVersion: 8
处理程序立即调用像play()这样生成JS的SM2方法 - > Flash调用,此调用无声地失败或被阻止。如果其SWF是针对Flash 8 API构建的,那么使用类似回调模式的其他JS + Flash库也可能会受到影响。怀疑时间或递归/堆栈问题,发现
onfinish()
引入用户指定的SM2回调,如setTimeout(callback, 0)
恢复顺序/播放列表功能。Flash Player 11.6.602.180,由Adobe于2013年3月12日发布,表现出相同的行为。为了避免额外的攻击,SM2将此应用于所有基于Flash 8的API回调,无论安装的是什么版本的Flash Player。由于这种变化,预计不会出现回归。
或者,使用
onfinish()
可以避免此问题,因为基于Flash 9的API似乎没有此问题。