我正在制作视频和在线练习的在线课程,并希望人们能够登录并跟踪他们的进度。
有没有办法可以衡量一个人观看过的youtube嵌入的百分比,并且如果他们已经观看过,那么将其标记为完整?比如说超过80%?
到目前为止,我最好的想法是当玩家的状态变为PLAYING时再使用getCurrentTime(),然后每隔五秒左右再次使用getCurrentTime()将差异添加到某种总数中。然而,如果有人在第一分钟观看了五次他们最终会看到一个勾选的视频,即使他们没有看到整个事情。
是否有更优雅的解决方案来计算观看视频的百分比,而不是上述方法来计算观看视频所花费的时间?
答案 0 :(得分:3)
这样的事情怎么样:
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
}
}
答案 1 :(得分:2)
我使用Angular YouTube嵌入模块用于AngularJS(在此处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));
};