【问题标题】:Youtube API event distinguish pause from seek/bufferYoutube API 事件将暂停与搜索/缓冲区区分开来
【发布时间】:2017-05-05 12:42:02
【问题描述】:

我们为视频开始/播放/暂停/完成事件设置了事件跟踪。

我们有统一的方式报告 HTML5、Youtube 和优酷视频的事件。对于 HTML5 和移动优酷视频,没有问题。对于桌面优酷(flash),我们必须设置一个setInterval 投票来检查视频处于什么状态,它不漂亮但效果很好。

问题在于 Youtube 嵌入视频。我们监听onStateChange 事件:

player.addEventListener('onStateChange', function(e) {

    if(e.data === 0) {
        // Complete

    } else if(e.data === 1) {
        // Play

    } else if(e.data === 2) {
        // Pause
    }
}

但是当用户在视频播放时在视频中寻找,与时间线栏交互时,播放器会触发暂停播放和缓冲 (e.data === 3) 事件。我们不想跟踪由寻找引起的暂停和播放。

在 chrome 中,我们可以区分 seek 动作,因为缓冲区事件总是首先触发。像32 以及当播放器完成缓冲时1。因此,我们忽略任何紧跟在缓冲区事件之后的暂停事件,以及任何跟在缓冲区事件之后的播放事件,而不管经过的时间。这很好用。

然而,在 firefox 中,事件的顺序是非常不同的。在 Firefox 中,缓冲区事件是尾随的。所以我们得到了213的订单。如果视频已经在缓冲,我们会得到231

还有其他方法可以检测 youtube 视频的搜索事件吗?还是一种捕捉序列的方法?

【问题讨论】:

标签: javascript youtube-api youtube-analytics


【解决方案1】:

这就是我最终解决此问题的方式。它将跟踪播放和暂停事件,但在用户搜索时不跟踪任何内容。据我所知,它在我测试过的浏览器中按预期工作。

var youtubeTrackingGate = youtubeTrackingGateFactory();

youtubePlayer.addEventListener('onStateChange', function(e) {
    if(e.data === -1 || e.data === 3) {

        youTubeTrackingGate({type: e.data});
    } else if(e.data === 1) {
        youTubeTrackingGate({type: e.data, event: 'PLAY'});
    } else if(e.data === 2) {
        youTubeTrackingGate({type: e.data, event: 'PAUSE'});
    }
});

function youtubeTrackingGateFactory () {
    var
        sequence = [],
        preventNextTracking = false,
        data,
        timeout;

    return function(obj) {

        // Chrome seek event
        if(util.compareArrays(sequence, [3]) && obj.type === 2) {
            preventNextTracking = true;

        // Prevent next play
        } else if(preventNextTracking && obj.type === 1) {
            preventNextTracking = false;

        } else {
            clearTimeout(timeout);

            // Save event
            sequence.push(obj.type);
            data = obj.event;

            timeout = setTimeout(function() {

                // Single event, let it pass if it's (play/pause)
                if(sequence.length === 1 && [1, 2].indexOf(sequence[0]) > -1) {

                    sendTracking(data);
                }

                sequence = [];
            }, 500);
        }

        // Suppress any (play/pause) after buffer event
        if(obj.type === 3) {

            // If not inital play
            if(!util.compareArrays(sequence, [-1, 3])) {
                preventNextTracking = true;

            // If is initial play
            } else {
                sequence = [];
            }
        }
    };
}


sendTracking(event) { 
    // code
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    相关资源
    最近更新 更多