声音管理器 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 和播放列表自动播放下一首歌曲不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用pygame自动完成歌曲后如何播放文件中的下一首歌曲

歌曲结束后如何让音频播放器播放下一首歌曲?

如何使用 PlaySound 同时执行其他功能?

无法播放队列中的下一首歌曲

如何使用 html 和 javascript 在网页上自动播放声音

c# winform wmplayer简单播放器,实现自动下一首播放,随机播放,显示歌词,多选listbox