Youtube API 事件区分暂停和 seek/buffer
Youtube API event distinguish pause from seek/buffer
我们已经为视频 start/play/pause/complete 事件设置了事件跟踪。
我们有统一的方式来报告 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
)事件。我们不想跟踪seeking造成的停顿和播放。
在chrome中我们可以区分查找动作,因为缓冲区事件总是先触发。像 3
、2
和当播放器完成缓冲时 1
。因此,我们忽略任何紧跟在缓冲区事件之后的暂停事件,以及任何跟在缓冲区事件之后的播放事件,而不管时间过去了。这很好用。
但是在 firefox 中,事件的顺序非常不同。在 firefox 中,缓冲区事件是尾随的。所以我们得到顺序2
、1
、3
。如果视频已经在缓冲,我们会得到 2
、3
、1
。
是否有另一种检测 YouTube 视频搜索事件的方法?或者捕获序列的方法?
这就是我最终解决这个问题的方式。它将跟踪播放和暂停事件,但不会在用户查找时跟踪任何内容。据我所知,它在我测试过的浏览器中按预期工作。
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
}
我们已经为视频 start/play/pause/complete 事件设置了事件跟踪。
我们有统一的方式来报告 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
)事件。我们不想跟踪seeking造成的停顿和播放。
在chrome中我们可以区分查找动作,因为缓冲区事件总是先触发。像 3
、2
和当播放器完成缓冲时 1
。因此,我们忽略任何紧跟在缓冲区事件之后的暂停事件,以及任何跟在缓冲区事件之后的播放事件,而不管时间过去了。这很好用。
但是在 firefox 中,事件的顺序非常不同。在 firefox 中,缓冲区事件是尾随的。所以我们得到顺序2
、1
、3
。如果视频已经在缓冲,我们会得到 2
、3
、1
。
是否有另一种检测 YouTube 视频搜索事件的方法?或者捕获序列的方法?
这就是我最终解决这个问题的方式。它将跟踪播放和暂停事件,但不会在用户查找时跟踪任何内容。据我所知,它在我测试过的浏览器中按预期工作。
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
}