如何在SoundManager2中按顺序播放声音

7

我如何在soundmanager2中实现音频的连续播放?也就是说,当第一个音频播放完毕后,第二个音频开始播放,第二个音频播放完毕后,第三个音频开始播放,以此类推。

4个回答

6
var soundArray = ['sound1', 'sound2', ...];
var chain = function (sound) {
soundManager.play(sound, { 
    multiShotEvents: true,
    onfinish: function () {
        var index = soundArray.indexOf(sound);
        if (soundArray[index + 1] !== undefined) {
            chain(soundArray[index + 1]);
        }
    }});
};

chain(soundArray[0])
使用递归时,唯一可能出现的问题是在数组中放置相同的声音两次(链可能无限)。

1

文档中有一个执行此操作的示例(请参见Demo4a)。play 方法将对象作为参数。该对象包含一组选项,其中之一是一个 onfinish 回调函数:

soundManager.play('firstSound',{
    multiShotEvents: true,
    onfinish:function() {
        soundManager.play('secondSound');
    }
});

multiShotEvents选项必须设置为true,才能在每个声音完成时触发onfinish事件。默认情况下,它只会在所有声音都完成后触发一次。

你可以通过这种方式排队播放任意数量的声音。


如何处理10首或2首以上的歌曲? - averbaher

1

我花了大约3个小时才想明白...但是现在它出现了:

soundManager.play('sound1',{
  multiShotEvents: true,
  onfinish:function() {
    soundManager.play('sound2',{
      multiShotEvents: true,
      onfinish:function() {
        soundManager.play('sound3');
      }
    });
  }
});

-1 不符合DRY原则,应使用递归队列函数(请参见上面的答案方法)。 - Ryan Brodie

1
除了Ashot的答案和其他答案,您可以在创建声音时设置onfinish函数,而不仅仅是在播放它时,例如:
var demo2Sound = soundManager.createSound({
 url: '../mpc/audio/CHINA_1.mp3',
 onfinish: function() {
   soundManager._writeDebug(this.id + ' finished playing');
 }
});

如果你需要在声音已经播放时更改onfinish函数,可以按照以下方式进行:

demo2Sound._onfinish = function(){ 
  //now this function will override the previous handler 
};

很好,请注意它应该放在createSound()函数内部。 - user1063287

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接