0

我有一个使用 soundmanager 2 播放音乐的功能,当我按下按钮加载下一个声音时,该功能有效,但是当我尝试通过该onfinish功能执行此操作时,它不起作用,这意味着当音乐播放完毕时它不起作用t 加载下一个声音我怎样才能让它工作,请参阅下面的代码。

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 加载这些声音,因为这些声音位于远程服务器上。

4

1 回答 1

0

来自 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-04-07T20:20:08.393 回答