【问题标题】:Youtube player api with loop带循环的 Youtube 播放器 api
【发布时间】:2013-10-25 00:03:52
【问题描述】:

我正在努力使用 youtube player api 为 youtube 视频设置循环。

问题是视频没有在循环下运行。

这是我的代码

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 player;
      function onYouTubeIframeAPIReady() {
        player = new YT.Player('player', {
          height: '390',
          width: '640',

          playerVars: {
            'controls': 0,           
            'showinfo': 0,
            'rel': 0,
            'loop': 1

          },
          videoId: 'qzZuBWMnS08',
          events: {
            'onReady': onPlayerReady,
           // 'onStateChange': onPlayerStateChange
          }
        });
      }
function onPlayerReady(event) {
        //  event.target.setLoop(true);
        event.target.playVideo();
      }

循环:1 似乎不起作用。还有什么方法可以从视频顶部删除分享和视频标题。

提前致谢。

【问题讨论】:

    标签: video youtube youtube-javascript-api


    【解决方案1】:

    如果视频没有变化,你可以这样做

    onStateChange: 
        function(e) {
            if (e.data === YT.PlayerState.ENDED) {
                player.playVideo(); 
            }
        }
    

    这将防止不必要地重新加载视频

    【讨论】:

    • +1 用于上述方法,因为它会立即播放视频,避免使用Google建议的“&playlist=VIDEO_ID”时发生的黑屏快速闪烁
    • 很好的解决方案。仅供参考,您也可以像 e.target.playVideo() 那样播放视频,让它更有活力。
    • 如果由于某种原因(即使用外部模块)您无法访问变量 YT 及其属性 YT.PlayerState.ENDED(在撰写本文时)为 0,因此您可以用这个代替 0 。
    【解决方案2】:

    这是我用于 API IFrame 视频循环的内容。我注意到您必须包含“播放列表:VIDEO_ID”参数。它有效。这是我的例子

    <script>
      // Load the IFrame Player API code asynchronously.
      var tag = document.createElement('script');
      tag.src = "https://www.youtube.com/player_api";
      var firstScriptTag = document.getElementsByTagName('script')[0];
      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
    
      // Replace the 'ytplayer' element with an <iframe> and
      // YouTube player after the API code downloads.
      var player;
    
      function onYouTubePlayerAPIReady() {
        player = new YT.Player('ytplayer', {
          height: '390',
          width: '640',
          videoId: 'VIDEO_ID',
          playerVars: {
            playlist: 'VIDEO_ID',
            loop: 1
          }
        });
      }
    </script>

    【讨论】:

    • 在 Android 上对此进行实验,我发现这仅在调用 javascript loadPlaylist() 方法而不是 loadVideo() 时才有效。作为副作用,这会导致 YouTube Web UI 显示播放列表控件,从而允许用户在播放列表中看到视频的弹出列表。在需要循环播放单个视频的情况下,这是一个不需要的副作用,因为使用单个视频播放列表的 UX 感觉很笨拙。
    【解决方案3】:

    documentation 中所述,您需要将playlist 参数设置为视频ID,以便循环工作。

    您会希望 showinfo 参数隐藏标题等。

    【讨论】:

    • 这个方法的问题是它把同一个视频作为新视频再次加载。
    • 错过了这个。我现在无法检查,但这不是问题,因为浏览器应该缓存/加载上次播放的视频吗?
    【解决方案4】:

    在你的 onPlayerStateChange 中试试这个,YouTube 希望你以某种方式再次输入 videoID。

    onStateChange: function(e){
        var id = 'qzZuBWMnS08';
    
        if(e.data === YT.PlayerState.ENDED){
            player.loadVideoById(id);
        }
    }
    

    【讨论】:

      【解决方案5】:

      我得到这个工作来给我设置超低音量的循环视频来播放视频。您可以通过将音量从 2 更改为 0 来静音。

      还要确保将您的视频添加到播放列表中。显然这是现在的一个问题。并在代码中的播放列表和videoid区域使用video id。

      我确定我有额外的步骤或冗余步骤,因为我没有编码器。

      我只知道这行得通。

          <div id="player">
      <script>
            // 2. This code loads 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);
            // 3. This function creates an <iframe> (and YouTube player)
            //    after the API code downloads.
            var player;
            function onYouTubeIframeAPIReady() {
              player = new YT.Player('player', {
                height: '315',
                width: '600',
                videoId: 'DrrH-YTvVVc',
                playerVars: {
                playlist: 'DrrH-YTvVVc',
                loop: 1      }       ,
         events: {
                  'onReady': onPlayerReady,
                  'onStateChange': onPlayerStateChange
                }
              });
            }
            // 4. The API will call this function when the video player is ready.
            function onPlayerReady(event) {
                 event.target.setVolume(2);
             event.target.playVideo();
            }
      
            // 5. The API calls this function when the player's state changes.
            //    The function indicates that when playing a video (state=1),
            //    the player should play for six seconds and then stop.
            var done = true;
            function onPlayerStateChange(event) {
              if (event.data == YT.PlayerState.ENDED) {
          //      setTimeout(stopVideo, 6000);
                        player.playVideo();
              }
                 event.target.setVolume(2);
            }
      </script></div>
      

      【讨论】:

        【解决方案6】:

        工作循环示例(02-2019)

        <div id="ytplayer">
        <script>
          var tag = document.createElement('script');
          tag.src = "https://www.youtube.com/player_api";
          var firstScriptTag = document.getElementsByTagName('script')[0];
          firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
          var player;
          function onYouTubePlayerAPIReady() {
            player = new YT.Player('ytplayer', {
              width: '640',
              height: '360',
        
                  // 1. Video_Id
                  videoId: 'AfAwsdbj04I',
        
              playerVars: { 
                  autoplay: 1,
                  loop: 1,
                  controls: 0,
                  rel: 0,
                  modestbranding: 1,
        
                  // 2. Playlist_Id (don't forget "PL")
                  playlist: 'PLxWQS97ZR2-_c2eqKxSHxEu7v462-qnYM'
        
              },
              events: {
                'onReady': onPlayerReady,
                'onStateChange': onPlayerStateChange
              }
            });
          }
          function onPlayerReady(event) {
            event.target.setVolume(80);
            event.target.playVideo();
         //  player.mute();
          }
          function onPlayerStateChange(event) {
            if (event.data == YT.PlayerState.ENDED) {
              player.seekTo(0);
              player.playVideo();
            }
          }
          function stopVideo() {
            player.stopVideo();
          }
        </script>
        </div>
        

        【讨论】:

        • 您好,感谢您分享答案。一般来说,人们在寻找解释,而不是代码。也许尝试扩展您的答案,了解您的建议为何有效和/或他们一开始做错了什么。
        【解决方案7】:

        由于是html5播放器,我们可以直接在视频上点右键=>循环播放。

        从脚本,到视频结尾重播:

        document.getElementsByClassName('video-stream html5-main-video')[0].loop = true
        

        两个时间点之间循环 1.66 秒:

        const video = document.getElementsByClassName('video-stream html5-main-video')[0]
        
        /* Loop markers in seconds */
        let start = 54.34, end = 56
        
        /* Seek to time in seconds */
        function seek(time){
          video.loop = true
          video.currentTime = time
          video.play()
        }
        
        /* Loop between start and end */
        function loop(e){
          if (e.target.currentTime > end){
            seek(start)
          }
        }
        
        /* Will loop for 1.66s */
        video.addEventListener("timeupdate", loop, false)
        
        /* Seek to 54.34s */
        seek(start)
        
        /* Abort the loop */
        // video.removeEventListener("timeupdate", loop, false)
        
        /* New loop */
        // start = 14; end = 15; seek(start)
        

        Media events list

        HTMLMediaElement reference

        【讨论】:

          猜你喜欢
          • 2020-06-27
          • 2012-10-20
          • 1970-01-01
          • 2018-09-14
          • 2014-11-12
          • 1970-01-01
          • 2019-01-11
          • 2020-01-23
          • 2023-03-24
          相关资源
          最近更新 更多