6

私はビデオとオンライン演習のオンライン コースを作成しており、人々がログインして進捗状況を追跡できるようにしたいと考えています。

誰かが視聴した YouTube 埋め込みのパーセンテージを測定し、80% 以上視聴した場合に完了としてマークする方法はありますか?

これまでの私の最善のアイデアは、プレーヤーの状態が PLAYING に変わったときに getCurrentTime() を使用し、その後 5 秒ごとに約 5 秒ごとにその差を何らかの合計に追加することです。しかし、誰かが最初の 1 分間を 5 回見た場合、最後まで見ていなかったとしても、チェックマークが付いたビデオになってしまいます。

ビデオの視聴に費やされた時間を計算する上記の方法ではなく、視聴されたビデオの割合を計算するためのより洗練されたソリューションはありますか?

4

2 に答える 2

5

このようなものはどうですか:

        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
            }

         }
于 2012-08-27T21:54:06.763 に答える
2

私は AngularJS 用の Angular 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));
       };
于 2015-01-07T05:58:38.870 に答える