youtube iframe api在另一个正在播放时停止播放视频

问题描述 投票:0回答:1

我有一个带有多个视频的滑块。我希望能够在播放另一个视频时停止一个视频(如果正在播放)。

我不是js专家,所以我在使其工作上遇到了一些麻烦。

我创建了这支笔:https://codepen.io/vlrprbttst/pen/eYpMrmB?editors=1010作为起点,但我不知道如何继续。我想这部分与我正在寻找的东西有关:

events: {
            'onReady': onPlayerReady,
            'onStateChange': onPlayerStateChange
          }

但是我不确定如何使用它:/

我曾经使用一种并不总是有效的方法,它依赖于一个复杂的系统,该系统具有不可见的iframe封面,可使用jquery触发视频的播放/暂停,但是它并不总是有效(您可以在此处查看:https://codepen.io/vlrprbttst/pen/vxrWzQ)。我一直在网上寻找,但我能找到的是一次播放多个视频。

关于在同一页面上播放不同视频时如何检测视频并停止播放的任何建议?有或没有jquery都可以。

非常感谢您

javascript jquery video youtube youtube-iframe-api
1个回答
1
投票

我建议您创建自己的YouTube播放器,并将它们存储在一个数组中。这样,您就可以始终在回调中遍历它们中的每一个,并控制应该发生的情况。

[首先创建一个用于存储播放器的空数组,并(可选)创建一个包含视频ID和创建播放器的元素的对象的数组。

let youtubePlayers = [];
const youtubeVideosSources = [
  {
    id: 'M7lc1UVf-VE',
    player: 'player1'
  },
  {
    id: 'VFQB1zE9zYU',
    player: 'player2'
  }
];

在准备好的回调中,使用ID为ID和播放器的数组的map()方法来创建新的YouTube播放器数组,并将它们存储在您之前创建的空数组中。或者,在这种情况下,请覆盖变量的值。

function onYouTubeIframeAPIReady() {
  youtubePlayers = youtubeVideosSources.map(({ id, player }) => new YT.Player(player, { 
    height: '360',
    width: '640',
    videoId: id,
    events: {
      'onReady': onPlayerReady,
      'onStateChange': onPlayerStateChange
    }
  }));
}

然后在onPlayerStateChange回调中循环播放每个播放器,如果它们不是当前激活的播放器并且正在实际播放,则将其停止。您可以使用getPlayerState()方法检查每个玩家的状态。

function onPlayerStateChange(event) {
  const playing = YT.PlayerState.PLAYING;
  if (event.data === playing) {
    for (const player of youtubePlayers) {
      if (player !== event.target && player.getPlayerState() === playing) {
        player.stopVideo();
      }
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.