【问题标题】:Distinguish between Fast Forward & Pause Event in Youtube Javascript API区分 Youtube Javascript API 中的快进和暂停事件
【发布时间】:2013-06-27 23:08:12
【问题描述】:

我正在使用Youtube Javascript API 加载和播放网站嵌入的视频。

当用户点击播放、暂停等时,会有代表这些状态的整数。例如:

YT.PlayerState.ENDED
YT.PlayerState.PLAYING
YT.PlayerState.PAUSED
YT.PlayerState.BUFFERING
YT.PlayerState.CUED

快进发送什么状态消息?

请注意,当我说“快进”时,我的意思是拖动视频计时器以使视频前进或返回到视频中的某个点。

你知道我如何检测到有人在快进吗?

*编辑:*
经过更多检查后,我确定当您拖动时间条时,会发送消息 YT.PlayerState.PAUSED。这是一个主要问题,因为当用户暂停视频时,我会将视频缩小到原始大小。 但由于快进与暂停发送相同的消息,当有人快进时视频会缩小,这是不应该发生的。

我知道如何区分暂停和快进吗?

【问题讨论】:

    标签: javascript youtube-api


    【解决方案1】:

    当用户“快进”或跟踪时,似乎没有发送任何事件。所以我想出了我自己的检测快进的方法。

    • 如果连续调度超过 1 个 PAUSE 事件:则用户正在“跟踪”(快速转发)
    • 如果调度了 1 个且仅 1 个 PAUSE 事件:则用户已暂停。
    <script>
        var PAUSE_EVT_STACK = 0;
    
        function onPlayerStateChange(event) {
            if (event.data == YT.PlayerState.PAUSED)
                PAUSE_EVT_STACK++;
            if (event.data == YT.PlayerState.PLAYING)
                PAUSE_EVT_STACK = 0;
    
            if (event.data == YT.PlayerState.PAUSED && PAUSE_EVT_STACK <= 1)
                console.log("Pause pressed");
            else if (event.data == YT.PlayerState.PAUSED && PAUSE_EVT_STACK > 1) {
                console.log("Tracking occuring");
                console.log("Hey! Dont fast forward during my ad you douche");
            }
        }
    
      function loadYouTubeVideo(uid) {
        setTimeout( function() {
            var instPlayer = new YT.Player(uid, {
                height: 480,
                width: 853,
                enablejsapi: 1,
                suggestedQuality: 'highres',
                videoId: uid,
                events: {
                        'onStateChange': onPlayerStateChange
                }
            });
        }, 500);
      }
    </script>
    

    【讨论】:

      【解决方案2】:

      我发现尝试使用 Jake M 的方法对我不起作用。我不知道是不是因为 API 发生了变化,但是遵循逻辑并使用我的控制台,逻辑总是会在触发快进触发器之前暂停。

      奇怪的是,过了一会儿,当我快进时,它只暂停了一次,而不是多次。

      由于这是一种异步情况(等待玩家事件),我发现最好从考虑时间的外部查看器方法中处理它,并进行 2 项检查:首先查看我们是否已经之前检查过,第二次检查播放器当前是否正在播放。

      如果您在第一次检查后 0.8 秒进行检查,它会给玩家足够的时间来确定是否应该暂停或播放,此时再次运行检查以查看是否应该这样做

      var check = false;
      var playing = false;
      function onPlayerStateChange(event) {
          if (event.data == YT.PlayerState.PLAYING) {
              slider.startStop(false);
              playing = true;
          } else if (event.data == YT.PlayerState.PAUSED) {
              playing = false;
              pauseCheck();
          } else if (event.data == YT.PlayerState.ENDED) {
              slider.goForward();
              slider.startStop(true);
          }
      }
      
      function pauseCheck() {
          // First time check is a "wait".
          if(!check) {
              check = true;
              setTimeout(pauseCheck, 800);
          // Second time check to determine true status.
          } else {
              // This means we fast-forwarded or rewound.
              if(playing) {
                  // DO FF / RW THINGS.
              // This means we really did want to pause.
              } else {
                  // DO PAUSE THINGS
              } 
              check = 0;
          }
      }
      

      【讨论】:

        【解决方案3】:

        嗯.. 不错的想法,并且在大多数情况下肯定很有用。但是,如果实际正在观看的用户必须暂停应用程序两次,以防他的女朋友在他正在观看的视频期间唠叨洗碗的事情,那么您将得到错误的响应。

        【讨论】:

          【解决方案4】:

          我发现跟踪不再接收 PAUSE 事件,而是触发 BUFFERING 事件,然后触发 PLAY 事件。

          播放 youtube 视频直到结束(无暂停或跟踪)时触发的事件顺序是:

          缓冲 -> 播放 -> 结束

          如果用户至少跟踪一次,则触发的事件将类似于:

          缓冲 -> 播放 [他们跟踪] -> 缓冲 -> 播放 -> 结束

          这里明显的警告是,当视频由于连接或处理问题而实际缓冲时,会出现误报。我已经通过一些限制对此进行了测试,但实际上在我的环境中无法得到任何误报。

          【讨论】:

            猜你喜欢
            • 2017-05-05
            • 1970-01-01
            • 2012-07-02
            • 2012-08-05
            • 1970-01-01
            • 2012-08-24
            • 1970-01-01
            • 1970-01-01
            • 2018-05-04
            相关资源
            最近更新 更多