首页 > 解决方案 > youtube iframe api在另一个正在播放时停止视频

问题描述

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

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

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

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

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

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

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

非常感谢你

标签: javascriptjqueryvideoyoutubeyoutube-iframe-api

解决方案


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

首先创建一个空数组来存储播放器和(可选)一个数组,该数组保存具有视频 id 的对象和要在其中创建播放器的元素。

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

在您的就绪回调中,使用map()带有 id 和播放器的数组的方法创建一个新的 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();
      }
    }
  }
}

推荐阅读