【问题标题】:Calculate percentage of youtube video viewed with API计算使用 API 观看的 youtube 视频的百分比
【发布时间】:2012-07-31 06:59:24
【问题描述】:

我正在制作一个包含视频和在线练习的在线课程,并希望人们能够登录并跟踪他们的进度。

有什么方法可以衡量有人观看过的 youtube 嵌入的百分比,如果他们观看过,则将其标记为完整,比如超过 80%?

到目前为止,我最好的想法是在玩家状态更改为 PLAYING 时使用 getCurrentTime(),然后每隔五秒左右再次使用,将差异添加到某种总数中。但是,如果有人在第一分钟观看了五次,他们最终会得到一个打勾的视频,即使他们没有看过整个视频。

是否有更优雅的解决方案来计算视频观看的百分比,而不是上述计算观看视频所用时间的方法?

【问题讨论】:

  • 我认为有人会打开视频并离开房间,而不是第一分钟观看五次。
  • 这是一个非常有趣的问题 - 我正在尝试为我自己的在线课程做同样的事情 - 你得到下面描述的答案了吗?
  • 嗨山姆,所以下面的解决方案 - 有效。 . .有点。主要功能只是通过您的视频计算当前百分比。因此,如果您跳到视频中的 90% 点,它将被标记为完成。我想一定有更好的办法。 . .

标签: javascript youtube youtube-api


【解决方案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】:

我正在为 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));
       };

【讨论】:

    猜你喜欢
    • 2017-06-26
    • 2015-04-29
    • 1970-01-01
    • 2014-06-14
    • 1970-01-01
    • 2011-04-08
    • 2019-08-17
    • 2013-11-29
    • 2023-03-17
    相关资源
    最近更新 更多