3

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

$(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
    })
  }
});
4

2 回答 2

2

This appears to be a bug in SoundManager. The soundManager.createSound method runs a _setup_html5 method. If you've set autoPlay, that _setup_html5 method calls a load function, which loads the sound.

However, in the load function, it checks to see if your browser supports HTML5. If it does, it again calls _setup_html5, which calls load the second time.

Do you follow?

Here's a sampling of the code:

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

this.load = function(oOptions) {
    //...
    if (html5OK(instanceOptions)) {
        oSound = s._setup_html5(instanceOptions);
        //...
    }
    //...
}
于 2013-07-09T16:15:49.093 回答
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()

于 2016-01-06T23:27:15.223 回答