【问题标题】:Play/pause using howler.js with meteor framework使用 howler.js 和流星框架播放/暂停
【发布时间】:2015-06-19 03:22:26
【问题描述】:

好的,所以我试图让用户在点击 gif 一次或两次时播放/暂停。我目前将它设置为用户只能播放一次声音而不会停止它。

我正在使用 javascript 音频库 howler.js 和流星框架。

下面是代码:

Template.gif.rendered = function () {
    freezeframe_options = {
    trigger_event: "click"
};

$.getScript("/client/scripts/freezeframe.js", function () {
    $(".gif").click(function () {
        if (!$(this).hasClass('played')) {
            var gifId = $(this).attr("data-gif-id");  // Will return the gif ID number
            var soundFile = $(this).attr("data-sound-file"); // Will return the sound file

            var fileFormat = "mp3";
            var mp3Test = new Audio();
            var canPlayMP3 = (typeof mp3Test.canPlayType === "function" && mp3Test.canPlayType("audio/mpeg") !== "");
            if (!canPlayMP3) {
                fileFormat = "ogg";
            }

            var sound = new Howl({
                urls: ['sounds/' + soundFile + '.' + fileFormat]
            }).play();

            $(this).addClass('played');
        }
        ;
    });
  });

};

【问题讨论】:

    标签: javascript audio meteor audio-player howler.js


    【解决方案1】:

    我正在使用一些类来跟踪当前的播放状态:

    • 正在播放 = 当前正在播放声音
    • paused = 声音当前暂停
    • played = 声音至少完整听过一次

    我已经创建了一个howlers 对象来存储 Howl 实例,并从 data-gif-id 键控(因此键是 data-gif-id,值是 Howl 对象)。如果 data-gif-id 键不在 howlers 对象中,那么我创建一个新的 Howl 对象,否则我只对已经在 howlers 对象中的对应值调用 play()pause() 方法。

    代码如下:

    Template.gif.rendered = function () {
      freezeframe_options = {
        trigger_event: "click"
      };
    
      howlers = {}; // set up an object to hold the Howl instances
    
      // moved these static lines out of the click function
      var fileFormat = "mp3";
      var mp3Test = new Audio();
      var canPlayMP3 = (typeof mp3Test.canPlayType === "function" && mp3Test.canPlayType("audio/mpeg") !== "");
      if (!canPlayMP3) {
        fileFormat = "ogg";
      }
    
      $.getScript("/client/scripts/freezeframe.js", function () {
        $(".gif").click(function () {
          var e = $(this);
          var soundFile = e.attr("data-sound-file") + '.' + fileFormat; // Will return the sound file
          var gifId = e.attr("data-gif-id");  // Will return the gif ID number
          if (gifId in howlers){
            if (e.hasClass('paused')){ // If currently paused, unpause
              e.removeClass('paused');
              e.addClass('playing');
              howlers[gifId].play();
            } else if (e.hasClass('playing')) {  // If currently playing, pause
              e.removeClass('playing');
              e.addClass('paused');
              howlers[gifId].pause();
            } else { // If not playing and not paused, play
              e.addClass('playing');
              howlers[gifId].play();
            }
          } else { // this is a new instance, so add it to the howlers object and start playing
            howlers[gifId] = new Howl({
              urls: ['sounds/' + soundFile],
              onend: function(){ // when playing ends, add the 'played' class to track which sounds have been played completely
                e.removeClass('playing');
                e.addClass('played');
              }
            });
            e.addClass('playing');
            howlers[gifId].play();
          }
        });
      });
    
    };
    

    【讨论】:

    • 非常感谢!!我一直在努力寻找一种方法来整合它,你精确地解决了它谢谢!!
    猜你喜欢
    • 2016-02-28
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-13
    相关资源
    最近更新 更多