جافاسكريبت - حساب نسبة مشاهدة فيديو يوتيوب باستخدام API
أنا أقوم بإنتاج دورة تعليمية عبر الإنترنت تتضمن مقاطع فيديو وتمارين عبر الإنترنت وأود أن يتمكن الناس من تسجيل الدخول وتتبع تقدمهم.
هل هناك طريقة يمكنني من خلالها قياس نسبة فيديو مدمج من يوتيوب قد شاهده شخص ما ووضع علامة مكتمل إذا شاهده، لنقل أكثر من 80%؟
أفضل فكرة لدي حتى الآن هي استخدام getCurrentTime() عندما تتغير حالة اللاعب إلى PLAYING، ثم مرة أخرى كل خمس ثوانٍ تقريبًا مع إضافة الفرق إلى نوع من المجموع الكلي. ومع ذلك، إذا شاهد شخص ما الدقيقة الأولى خمس مرات، فسوف ينتهي به الأمر بفيديو محسوب عليه عدة مرات، على الرغم من أنه لم يشاهد كل الفيديو.
هل هناك حل أكثر أناقة لحساب نسبة مشاهدة الفيديو، بدلاً من الطريقة المذكورة أعلاه التي تحسب مقدار الوقت المستغرق في مشاهدة الفيديو؟
الإجابة رقم 1
ماذا عن شيء مثل هذا:
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
}
}
الإجابة رقم 2
أنا أستخدم وحدة تضمين يوتيوب الخاصة بـ Angular لـ AngularJS (الموجودة هنا https://github.com/brandly/angular-youtube-embed). لكن هذا الحل سيعمل بنفس الطريقة مع جافاسكريبت النقية/مكالمات واجهة برمجة تطبيقات يوتيوب. أنا فقط لا أشعر بالرغبة في إعادة كتابة الحل الخاص بي.
المفهوم الأساسي هو أنك تقوم بتقطيع طول الفيديو بالكامل إلى مقاطع بأحجام عشوائية. في هذا الحل النموذجي، أقوم بتقسيم الفيديو إلى سلسلة من المقاطع التي مدتها 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));
};
