You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

点击上/下曲按钮无法切换已初始化的YouTube音频播放器的音频源,求解决方法

点击上/下曲按钮无法切换已初始化的YouTube音频播放器的音频源,求解决方法

我在StackOverflow上找到一个基于YouTube链接的音频播放器,打算把它用到自己的网站上——毕竟我用的服务器免费版不支持存储音视频文件,这样就不用自己传音频文件了。这个播放器是Max Zheng开发的,包含CSS、JavaScript和HTML三部分代码。

我的需求是:在代码里存一组YouTube链接,让用户可以通过点击“上一曲”和“下一曲”按钮切换歌曲。

目前我已经写出了包含按钮、链接和播放器的代码(如下),按钮和链接的逻辑是正常的,但问题是播放器初始化之后,点击按钮无法切换音频源。有没有大佬能教教我怎么实现初始化后切换音频源的功能?

<html>

<head>
  <meta charset="UTF-8">
  <link rel="stylesheet">
  <script src="https://www.youtube.com/iframe_api"></script>

  <script>
    function onPlayerReady(event) {
      document.getElementById(ui.play).addEventListener('click', togglePlay);
      timeupdater = setInterval(initProgressBar, 100);
    }

    function onPlayerStateChange(event) {
      if (event.data == YT.PlayerState.ENDED) {
        document.getElementById(ui.play).classList.remove('pause');
        document.getElementById(ui.percentage).style.width = 0;
        document.getElementById(ui.currentTime).innerHTML = '00:00';
        player.seekTo(0, false); //change here the false to true if you want your audio to loop automatically
      }
    }

    let ui = {
      play: 'playAudio',
      audio: 'audio',
      percentage: 'percentage',
      seekObj: 'seekObj',
      currentTime: 'currentTime'
    };

    function togglePlay() {
      if (player.getPlayerState() === 1) {
        player.pauseVideo();
        document.getElementById(ui.play).classList.remove('pause');
      } else {
        player.playVideo();
        document.getElementById(ui.play).classList.add('pause');
      }
    }

    function calculatePercentPlayed() {
      let percentage = (player.getCurrentTime() / player.getDuration()).toFixed(2) * 100;
      document.getElementById(ui.percentage).style.width = `${percentage}%`;
    }

    function calculateCurrentValue(currentTime) {
      const currentMinute = parseInt(currentTime / 60) % 60;
      const currentSecondsLong = currentTime % 60;
      const currentSeconds = currentSecondsLong.toFixed();
      const currentTimeFormatted = `${currentMinute < 10 ? `0${currentMinute}` : currentMinute}:${
          currentSeconds < 10 ? `0${currentSeconds}` : currentSeconds
          }`;

      return currentTimeFormatted;
    }

    function initProgressBar() {
      const currentTime = calculateCurrentValue(player.getCurrentTime());
      document.getElementById(ui.currentTime).innerHTML = currentTime;
      document.getElementById(ui.seekObj).addEventListener('click', seek);

      function seek(e) {
        const percent = e.offsetX / this.offsetWidth;
        player.seekTo(percent * player.getDuration());
      }

      calculatePercentPlayed();
    }

    var a = "jLdAuGarfM0"; //infinita highway

    var b = "M7lc1UVf-VE";

    var c = "glbmprjG3zw"; //hai yorokonde

    var d = "p6NzVd3pGdE"; //instambul

    var e = "2rHRztFGOm8";

    let teste = "37nwLhIA1zs";

    let shitpost = "i6l8MFdTaPE";

    let techto = e;


    function onYouTubeIframeAPIReady() {
      player = new YT.Player('player', {
        height: '360',
        width: '640',
        videoId: id_video,
        events: {
          'onReady': onPlayerReady,
          'onStateChange': onPlayerStateChange
        }
      });
    }
  </script>
</head>

<body>
  <!--Youtube-->
  <div id="player" style="display: none; visibility: hidden;"></div>

  <!--Player-->
  <p id="nome_musica"></p>

  <div class="audio-player">
    <div class="player-controls">
      <div id="radioIcon"></div>
      <button id="playAudio"></button>
      <div id="seekObjContainer">
        <div id="seekObj">
          <div id="percentage"></div>
        </div>
      </div>
      <p><small id="currentTime">00:00</small></p>
    </div>
  </div>
  <button id="tras" >Previous Song</button>
  <button id="frente" >Next Song</button>
  <button id="bug"> FUNCIONE DESGRAÇA</button>
  <p>Song number</p>
  <p id="x" > </p>
  <script>
    var xe = 1;
    //var id_video = "jLdAuGarfM0";
    //var id_video = a;
    var inicio = checkin(xe);

    document.getElementById("tras").onclick = function() {
      bottras()
    };
    document.getElementById("frente").onclick = function() {
      botfrente()
    };
    //document.getElementById("bug").onclick = function()  {onYouTubeIframeAPIReady()};  <----- NÃO

    function botfrente() {
      yg = xe + 1;
      if (yg >= 4) {
        var yg = 1;
        checkin(yg);
        return xe = yg;
      } else {
        checkin(yg);
        return xe = yg;
      }
      document.getElementById("x").innerHTML = xe;
    }

    function bottras() {
      yg = xe - 1;
      if (yg <= 0) {
        var yg = 3;
        checkin(yg);
        return xe = yg;
      } else {
        checkin(yg);
        return xe = yg;
      }
    }

    function checkin(z) {
      document.getElementById("x").innerHTML = z;
      if (z == 1) {
        document.getElementById("nome_musica").innerHTML = "Engenheiros do Hawaii - Infinita Highway (ao vivo)";
        //substitute the text above with the name of the song
        id_video = a;
        //substitute the variable with your song
      } else if (z == 2) {
        document.getElementById("nome_musica").innerHTML = "They Might Be Giants - Istambul(not Constantinople)";
        id_video = d;
      } else if (z == 3) {
        document.getElementById("nome_musica").innerHTML = "Kocchi no Kento - Hai Yorokonde";
        id_video = c;
      } else {
        document.getElementById("error").innerHTML = "error in the system"
      }
    }
  </script>
</body>

</html>

备注:内容来源于stack exchange,提问作者NGU Animações

火山引擎 最新活动