声音管理器 2 和播放列表自动播放下一首歌曲不起作用
Posted
技术标签:
【中文标题】声音管理器 2 和播放列表自动播放下一首歌曲不起作用【英文标题】:Sound Manager 2 and playlist automatically play next song doesn't works 【发布时间】:2013-03-29 13:30:50 【问题描述】:我有一个文字 JS 对象来创建和播放我的播放列表。 在 html 页面中,我有一个包含所有曲目的列表。 当我单击某个曲目时,一切正常,但是当我单击一个曲目并等待曲目结束时,下一首曲目无法播放。 这是我的代码的一部分:
playSound : function(track)
console.log("Play this song");
DG_PLAYER.TrackPlaying = track;
soundManager.destroySound('MySoundID');
DG_PLAYER.Sound = soundManager.createSound(
id:'MySoundID',
url:track.sound,
autoLoad: true,
autoPlay: true,
onload: function() console.log('sound loaded!', this); ,
onfinish: function()
console.log('end song');
var nextSong = DG_PLAYER.getNextSong();
DG_PLAYER.playSound(nextSong);
,
onfailure : function()console.log('some error'),
whileloading : function()console.log('i m loading');,
whileplaying : function()console.log('i m playing');
);
,
如果我像这样更改 onfinish 事件的行: setTimeOut(function()DG_PLAYER.playSound(nextSong);,2000) 它工作正常。 有人可以帮助我吗?
还有一件事,当第一首歌曲完成并为下一首歌曲调用播放时,该曲目未加载(onload 事件没有返回消息)。 谢谢,对不起我的英语不好。 A.
好的, 我尝试在设置中添加“flashVersion: 9”,这可以解决问题,但在 IE 8 上我现在有 un action script 消息。
【问题讨论】:
【参考方案1】:From SoundManager2's Revision History:
Adobe 于 2013 年 2 月 26 日发布的 Flash Player 11.6.602.171 引入了 SM2 的默认 Flash 8 (flashVersion: 8) 基于 API 的 JS/Flash 交互的问题,其中 SM2 方法从回调中调用,例如 @987654323 @ 行不通。这主要破坏了用于顺序播放声音、串行加载一系列声音等的方法。 (更多信息请参见discussion。)
请注意,这不会影响使用
soundManager.setup( flashVersion: 9)
的情况;但是,SM2 默认使用flashVersion: 8
。具体来说,Flash 启动的事件(例如声音结束)使 Flash -> JS 调用 SM2 API,后者随后调用用户指定的事件处理程序。如果用户指定的 SM2
onfinish()
处理程序立即调用类似 play() 的 SM2 方法,该方法进行 JS -> Flash 调用,则此调用要么静默失败,要么被阻塞。其他使用类似回调模式的 JS + Flash 库也可能会受到影响,如果它们的 SWF 是针对 Flash 8 API 构建的。怀疑存在时序或递归/堆栈问题,发现将
setTimeout(callback, 0)
引入用户指定的 SM2 回调(如onfinish()
)可恢复顺序/播放列表功能。Adobe 于 2013 年 3 月 12 日发布的 Flash Player 11.6.602.180 表现出相同的行为。为避免额外的黑客攻击,SM2 将此应用于所有基于 Flash 8 的 API 回调,无论安装的是什么版本的 Flash Player。预计此更改不会导致任何回归。
或者,这个问题可以通过使用
soundManager.setup( flashVersion: 9 )
来避免,因为基于 Flash 9 的 API 似乎没有这个问题。
【讨论】:
以上是关于声音管理器 2 和播放列表自动播放下一首歌曲不起作用的主要内容,如果未能解决你的问题,请参考以下文章