【问题标题】:How to stop embedded Youtube videos from playing simultaneously如何阻止嵌入的 Youtube 视频同时播放
【发布时间】:2012-10-11 06:15:49
【问题描述】:

SoundCloud 播放器具有默认功能,当用户启动播放器时,它会自动暂停当前正在播放的所有其他播放器。 (例如:http://jsfiddle.net/Vx6hM/)。

我正在尝试使用通过普通嵌入代码动态添加的嵌入式 youtube 视频重新创建它。

使用这个:https://stackoverflow.com/a/7513356/938089 还有这个:https://stackoverflow.com/a/7988536/1470827

我能做到这一点:

function chain(){

$('.post').each(function(){
    var player_id = $(this).children('iframe').attr("id");
    var other_player_id = $(this).siblings().children('iframe').attr("id");

    player = new YT.Player( player_id, { 

        events:
            {      
            'onStateChange': function (event) 
                {

                if (event.data == YT.PlayerState.PLAYING) 
                    { callPlayer( other_player_id , 'pauseVideo' );
                     alert('Trying to pause: ' + other_player_id);
                    }            

                }
            }        
    });

});

}

这是一个运行了一半的 JS Bin:http://jsbin.com/oxoyes/2/edit

目前,它只调用其中一名玩家。我需要它来暂停所有其他玩家,除了正在播放的玩家。

此外,欢迎提供有关如何清理和/或以不同方式/更好地进行操作的任何提示。我对 javascript 还是很陌生,所以我什至不确定我是否以正确的方式进行。

谢谢!

【问题讨论】:

标签: javascript jquery youtube youtube-api


【解决方案1】:

在给定时间您最多只能有一名玩家在玩。与其尝试暂停所有正在播放的内容,不如将其视为尝试暂停正在播放的内容。当然,没有人可以玩。鉴于此,请查看以下代码。您维护一个外部范围变量并在必要时暂停它,同时将其设置为您刚开始播放的播放器。

var playerCurrentlyPlaying = null;
function chain(){       
    $('.post').each(function(){
        var player_id = $(this).children('iframe').attr("id");
        player = new YT.Player( player_id, { 
            events:
                {      
                'onStateChange': function (event) 
                    {

                    if (event.data == YT.PlayerState.PLAYING) 
                        { 
                          if(playerCurrentlyPlaying != null && 
                          playerCurrentlyPlaying != player_id)
                          callPlayer( playerCurrentlyPlaying , 'pauseVideo' );
                          playerCurrentlyPlaying = player_id;

                        }            

                    }
                }        
        });
    });
}

【讨论】:

    【解决方案2】:

    我认为这可能会实现您的解决方案

    var players=[];
     function chain(id){
    
    
        var player_id = $('#player'+id).attr('id');
    
    
       players[id]=new YT.Player( player_id, { 
    
            events:
                {      
                'onStateChange': onPlayerStateChange
                }
    
        });
    
     }
    
     function onPlayerStateChange(event){
    
    
      var playerid=$(event.target).attr('id');
    
      if(event.data!=-1 && event.data!=5){
    
          for(i=1;i<players.length;i++){
    
           if(playerid!=i){
    
    
          players[i].stopVideo();
           }
    
         }
    
    
       }
    }
    

    您之前的代码的问题在于您使用 each in call 函数,因此它可能执行 3*3 次,因此创建了 9 个播放器实例。所以我所做的就是将每个实例存储在一个数组中。

    演示http://jsbin.com/oxoyes/11/edit

    【讨论】:

      【解决方案3】:

      我尝试了 cbayram 发布的方式,发现它的成功率参差不齐。 我更喜欢 fuzionpro 的方式,但不得不用它纠正一些问题,我想出了以下内容,它运行良好,包括 console.logs,所以你可以看到发生了什么。 可能结合下面的 ytPlayers 和 ytPlayerStates 会提高效率。

      // load the IFrame Player API code asynchronously
      var tag = document.createElement('script');
      tag.src = "https://www.youtube.com/iframe_api";
      var firstScriptTag = document.getElementsByTagName('script')[0];
      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
      
      var ytPlayers = new Array();
      var ytPlayerStates = new Array();
      
      window.onYouTubePlayerAPIReady = function()
      {
          jQuery('.video-container>iframe').each(function(index)
          {
              var iframeID = jQuery(this).attr('id');
              ytPlayerStates[iframeID] = -1;
      
              (function (iframeID) {
                  ytPlayers.push(new YT.Player(iframeID, { 
                      events:
                      {      
                          'onStateChange' : function (event) 
                          {
                              console.log(iframeID+' '+event.data);
      
                              if (event.data == 1)
                              {
                                  ytPlayerStates[iframeID] = 1;
                                  for (var key in ytPlayerStates)
                                  {
                                      if (key != iframeID)
                                      {
                                          if (ytPlayerStates[key] == 1 || ytPlayerStates[key] == 3)
                                          {
                                              ytPlayerStates[key] = 2;
                                              callPlayer(key, 'pauseVideo')
                                          }
                                      }
                                      console.log(key+' : '+ytPlayerStates[key]);
                                  };
                              }
                          }
                      }
                  }));
              })(iframeID); 
          });
      }
      

      【讨论】:

        猜你喜欢
        • 2015-12-12
        • 1970-01-01
        • 2013-03-03
        • 2014-10-12
        • 1970-01-01
        • 1970-01-01
        • 2021-01-19
        • 1970-01-01
        • 2011-07-10
        相关资源
        最近更新 更多