1

我有一个文字 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) 它工作正常。有人可以帮助我吗?

另一件事是,当第一首歌曲完成并为下一首歌曲调用 Play 时,该曲目未加载(onload 事件没有返回消息)。谢谢,对不起我的英语不好。一种。

好的,我尝试在设置中添加“flashVersion:9”,这可以解决问题,但在 IE 8 上我现在有 un action script 消息。

4

1 回答 1

1

来自 SoundManager2 的修订历史

Adobe 于 2013 年 2 月 26 日发布的 Flash Player 11.6.602.171 引入了 SM2 的默认 Flash 8 (flashVersion: 8) 基于 API 的 JS/Flash 交互的问题,其中从回调等调用的 SM2 方法onfinish()不起作用。这主要破坏了用于顺序播放声音、串行加载一系列声音等的方法。(有关更多信息,请参阅讨论。)

请注意,这不会影响soundManager.setup({ flashVersion: 9})正在使用的情况;但是,SM2flashVersion: 8默认使用。

具体来说,Flash 启动的事件(例如声音结束)使 Flash -> JS 调用 SM2 API,随后调用用户指定的事件处理程序。如果用户指定的 SM2onfinish()处理程序立即调用类似 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 似乎没有这个问题。

于 2013-03-29T15:00:09.327 回答