区分快进&在Youtube Javascript API中暂停事件

时间:2013-06-27 23:08:13

标签: javascript youtube-api

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

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

  

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

为快进发送了什么状态消息?

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

你知道我什么时候可以检测到有人快进吗?

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

我有什么想法可以区分暂停和快进吗?

4 个答案:

答案 0 :(得分:5)

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

  
      
  • 如果连续调度多于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>

答案 1 :(得分:1)

我发现尝试使用Jake M的方法并不适合我。我不知道它是否因为API已经改变,但是遵循逻辑,并且使用我的控制台,逻辑总是会在达到快进触发之前暂停。

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

由于这是一种异步情况(等待玩家事件),我发现最好通过外部观察器方法接近它,需要花费时间考虑,并进行2次检查:第一次看看我们是否& #39;之前已经检查过,第二次查看玩家当前是否在玩。

如果你在第一次检查后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;
    }
}

答案 2 :(得分:0)

嗯......很好的想法,绝大多数时候都很有用。但是,如果正在观看的用户必须暂停应用两次,以防他的女朋友在他正在观看的视频中唠叨洗碗时,你会得到错误的回应。

答案 3 :(得分:0)

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

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

BUFFERING - &gt;播放 - &gt;截至

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

BUFFERING - &gt;播放[他们跟踪] - &gt;缓冲 - &gt;播放 - &gt;截至

这里显而易见的警告是,当视频由于连接或处理问题而实际缓冲时,这是误报。我已经通过一些节流测试了这一点,但实际上我的环境中没有任何误报。