【问题标题】:How to control play and pause in HTML5 Audio如何在 HTML5 音频中控制播放和暂停
【发布时间】:2017-03-12 10:22:51
【问题描述】:

我正在创建一个既没有播放列表又有播放列表的音乐播放器。 当单击播放按钮或单击播放列表中的曲目之一时,音乐开始播放。并且一次只能播放一首曲目。

这是我的代码:DEMO

$.fn.MusicPlayer = function(options) {
  var settings = $.extend({
    // These are the defaults
    title: "",
    track_URL: "",
    load_playlist: ""
  }, options);
  var audio, thisObj, playPauseBTN;
  audio = new Audio();
  thisObj = this;
  playPauseBTN = $(".playButton", thisObj);

  //Statuses Evnts
  $(audio).on("playing", function() {
    togglePlying(playPauseBTN, true);
    $(playPauseBTN).addClass("pause");
  });
  $(audio).on("pause", function() {
    togglePlying(playPauseBTN, false);
    $(playPauseBTN).removeClass("pause");
  });


  thisObj.each(function() {
    audio.src = settings.track_URL;
    $(".title", thisObj).text(settings.title);

    if (settings.load_playlist == "true") {
      $(thisObj).css("height", "140px");
      $(thisObj).append("<div class='playlist'></div>");
      $(".playlist", thisObj).append("<div class='row' data-src='https://p.scdn.co/mp3-preview/c92cc644b1eb5094ce65cf561c41b0c6d9f3faaa'>music 1</div>");
      $(".playlist", thisObj).append("<div class='row' data-src='https://p.scdn.co/mp3-preview/dc73c2b8aa08c7b5ac2c72813326fbd6aa65787b'>music 2</div>");
      $(".playlist", thisObj).append("<div class='row' data-src='https://p.scdn.co/mp3-preview/b2da3e7ee2834c24fbf5a0927e59d34cc618e30e'>music 3</div>");
    }
  });


  $(playPauseBTN, thisObj).on("click tap", function() {
    manageAudio();
  });

  $(".playlist > .row", thisObj).on("click tap", function() {
    audio.src = $(this).attr("data-src");
    manageAudio();
  });


  function manageAudio() {
    if (audio.paused) {
      audio.play();
      $('.playButton.playing').click();

      $(thisObj).addClass("bekhon");
      $(".sMusicPlyaer").removeClass("nakhon ");
    } else {
      audio.pause();

      $(thisObj).addClass("nakhon");
      $(".sMusicPlyaer").removeClass("bekhon");
    }
  }
}


// Utility functions
function togglePlying(aClassName, bool) {
  $(aClassName).toggleClass("playing", bool);
}

$("#player1").MusicPlayer({
  title: "title 1",
  track_URL: "https://rjmediamusic.com/media/mp3/mp3-256/Alireza-JJ-Sijal-Nassim-Ki-Khoobe-Ki-Bad-(Ft-Behzad-Leito-Sami-Low-AFX).mp3"
});

$("#player2").MusicPlayer({
  title: "title 2",
  track_URL: "http://myst729.qiniudn.com/within-temptation_pale.mp3",
  load_playlist: "true"
});

$("#player3").MusicPlayer({
  title: "title 3",
  track_URL: "https://p.scdn.co/mp3-preview/657f7141682f667253bf9c3afab5feebccf75105"
});
body {
  background: url(http://wallpapercave.com/wp/VkyGWEi.jpg) no-repeat;
  background-size: cover;
}

.sMP {
  background: rgba(255, 255, 255, 0.5);
  color: #000;
  width: 400px;
  height: 50px;
  margin: 10px;
}

.playButton {
  background: url(https://cdn4.iconfinder.com/data/icons/standard-free-icons/139/Play01-64.png);
  background-size: 30px 30px !important;
  width: 30px;
  height: 30px;
}

.playButton.pause {
  background: url(https://cdn4.iconfinder.com/data/icons/ionicons/512/icon-pause-48.png);
}

.row {
  border: 1px solid black;
  margin: 5px 0 5px 0;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="sMP" id="player1">
  <div class="playButton"></div>
  <div class="title"></div>
</div>
<div class="sMP" id="player2">
  <div class="playButton"></div>
  <div class="title"></div>
</div>
<div class="sMP" id="player3">
  <div class="playButton"></div>
  <div class="title"></div>
</div>

上面的代码做了部分代码。它一次播放一首曲目,但如果单击同一播放列表中的一首曲目,则会暂停该曲目。 (必须开始播放它)。 要对其进行测试,请单击播放列表中的music 1,并在播放时单击music 2。您会看到曲目暂停而不是开始播放。

有什么办法解决这个问题吗?

【问题讨论】:

    标签: javascript jquery html audio html5-audio


    【解决方案1】:

    超时后播放音频:

    function manageAudio() {
        if (audio.paused) {
    
     //play after 150ms
        setTimeout(function () {      
           audio.play();
        }, 150);
    
          $('.playButton.playing').click();
    
          $(thisObj).addClass("bekhon");
          $(".sMusicPlyaer").removeClass("nakhon ");
        } else {
          audio.pause();
    
          $(thisObj).addClass("nakhon");
          $(".sMusicPlyaer").removeClass("bekhon");
        }
      }
    

    签出:How to prevent "The play() request was interrupted by a call to pause()" error?

    【讨论】:

    • 感谢您的回复。它确实有效,但控制台中的错误是jquery.min.js:2 Uncaught RangeError: Maximum call stack size exceeded(…)。基于this,我认为它的play() 和pause() 函数之间存在一个循环。你有什么方法可以解决这个问题吗?谢谢UPDATED DEMO
    • 检查`$(audio).on("playing", function() { togglePlying(playPauseBTN, true); $(playPauseBTN).addClass("pause"); });` 似乎它多次调用 playPauseBTN 事件,因为第二个参数设置为 true(将 console.log 放在 manageAudio() 方法上)。
    猜你喜欢
    • 2015-09-03
    • 2014-08-21
    • 2011-08-09
    • 1970-01-01
    • 2015-04-03
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多