SoundManager2 AutoPlay加载文件两次

时间:2013-07-09 14:19:20

标签: jquery soundmanager2

我必须包含一个音频文件,该文件会自动播放并可以暂停并通过按钮再次播放。暂停和播放工作,但似乎,文件加载两次,我找不到问题。当我暂停时,音量会下降,如果我按下播放按钮,一个“层”继续播放,我暂停播放,另一个继续播放...这是代码:

$(document).ready(function() {
  $('#play').hide();
  soundManager.setup({
    debugMode: false,
    onready: function () {
      soundManager.createSound({
        id: 'music',
        url: 'up/files/file.mp3',
        autoPlay: true,
        autoLoad: false
      })
    }
  });

  $('#play').bind('click', function() {
    var sound = soundManager.getSoundById('music');
    sound.play();
    $('#pause').show();
    $('#play').hide();
  });

  $('#pause').bind('click', function() {
    var sound = soundManager.getSoundById('music');
    sound.pause();
    $('#pause').hide();
    $('#play').show();
  });
});

修改

正如Alex Morrise所说,这似乎是soundmanager2.js文件中的一个错误。我现在通过提供swf文件的路径并将preferFlash选项设置为true来修复此问题,如下所示:

soundManager.setup({
  url: 'path/to/swf-files',
  preferFlash: true,
  debugMode: false,
  onready: function () {
    soundManager.createSound({
      id: 'music',
      url: 'up/files/file.mp3',
      autoPlay: true,
      autoLoad: false
    })
  }
});

2 个答案:

答案 0 :(得分:2)

这似乎是SoundManager中的一个错误。 soundManager.createSound方法运行_setup_html5方法。如果您设置了autoPlay,则_setup_html5方法会调用load函数来加载声音。

但是,在load函数中,它会检查您的浏览器是否支持HTML5。如果是,则会再次调用_setup_html5,第二次调用load

你关注吗?

以下是代码的示例:

this._setup_html5 = function(oOptions) {
    //...
    if (instanceOptions.autoLoad || instanceOptions.autoPlay) {
        s.load();
    }
    //...
}

this.load = function(oOptions) {
    //...
    if (html5OK(instanceOptions)) {
        oSound = s._setup_html5(instanceOptions);
        //...
    }
    //...
}

答案 1 :(得分:0)

我最近遇到过这个问题。

我注意到来自Soundmanager2调试输出的消息:

克隆Audio()例如#

SoundObject克隆对我的用途并没有用。

我编辑了soundmanager2.js文件。 搜索输出字符串:

  

克隆音频()

第2021行:

if (s.instanceCount < 2) {

        // HTML5 single-instance case

        start_html5_timer();

        a = s._setup_html5();

        s.setPosition(s._iO.position);

        a.play();

      } /*else {

        // HTML5 multi-shot case

        sm2._wD(s.id + ': Cloning Audio() for instance #' + s.instanceCount + '...');

        audioClone = new Audio(s._iO.url);

        onended = function() {

        ...

注释掉整个 else 选项,soundmanager2的 html5支持仅使用一个SMSound对象。

它仍允许通过再次使用方法

创建新对象来自动播放元素

soundManager.createSound()