我制作的视频和在线练习在线课程,并希望人们能够登录并跟踪他们的进展。
是有,我可以衡量一个YouTube的比例嵌入,有人边看边标记为完成,如果他们看的方式,比方说80%以上?
我的最好的办法,到目前为止是使用getCurrentTime()当玩家的状态更改为玩,然后每五秒钟一次,或因此增加的差异某种总计。 但是,如果有人看了第一分钟五倍,他们会最终有一个勾掉视频,即使他们还没有看到整个事情。
是否有一个更好的解决方案来计算观看的视频的%,而不是计算所花费的时间观看该视频的量的上述方法?
我制作的视频和在线练习在线课程,并希望人们能够登录并跟踪他们的进展。
是有,我可以衡量一个YouTube的比例嵌入,有人边看边标记为完成,如果他们看的方式,比方说80%以上?
我的最好的办法,到目前为止是使用getCurrentTime()当玩家的状态更改为玩,然后每五秒钟一次,或因此增加的差异某种总计。 但是,如果有人看了第一分钟五倍,他们会最终有一个勾掉视频,即使他们还没有看到整个事情。
是否有一个更好的解决方案来计算观看的视频的%,而不是计算所花费的时间观看该视频的量的上述方法?
怎么样是这样的:
var i; //Global variable so that you can reset interval easily
function onYouTubePlayerReady(playerid)
{
ytp = document.getElementById("ytvideo"); //get player on page
ytp.d = ytp.getDuration(); //get video duration
i = setInterval(checkPlayer, 5000); //check status
}
function onplayerReset()
{
clearInterval(i);
}
function checkPlayer()
{
var p = ytp.getCurrentTime(); //get video position
var d = ytp.d; //get video duration
var c = p/d*100; //calculate % complete
c = Math.round(c); //round to a whole number
var t = document.getElementById('videotitle').innerHTML;
if(ytp.isReset) { c = 0; }
ytp.c=c;
if(!ytp.completed)
{
if(c>=80) { _gaq.push(['_trackEvent', 'Video Status', t,'Complete']); ytp.completed=true; } // or do something else
}
}
我使用AngularJS的角度YouTube的嵌入模块(这里找到https://github.com/brandly/angular-youtube-embed )。 但是,这种解决方案将工作同样为纯JavaScript / YouTube的API调用。 我只是不喜欢重新写我的解决方案。
基本概念是,你是切片的视频全长成任意大小的段。 在此样品溶液我分割视频成一系列的10秒片。 每5秒计时器检查在对应于它的切片玩家当前时间。 您测试不是每个人代表片的长度更频繁地是非常重要的。
所述getPctCompleted()方法会给你在总视频的长度的完成率,而不管用户是否跳转到视频结束的。
但高级用户将总是能够欺骗这一点。 所以这真的不是“证明”有人看着什么。 这是不可信的输入,就像用户进行任何其他输入。
$scope.analyzer = {};
$scope.timeElapsed = 0;
$scope.videoLength = 0;
$scope.$on('youtube.player.playing', function($event, player) {
$scope.videoLength = player.getDuration();
$scope.player = player;
//start polling
setInterval(function() {
$scope.timeElapsed = $scope.player.getCurrentTime();
$scope.analyzer[parseInt($scope.timeElapsed / 10)] = true;
$scope.$apply();
}, 5000);
});
$scope.getPctCompleted = function() {
return Object.keys($scope.analyzer).length / (parseInt($scope.videoLength / 10));
};