问题 Youtube iframe javascript,跟踪视频的百分比?


我正在尝试准确计算用户观看视频的时间。他们观看的时间不应包括向前跳过或视频暂停时。我现在的代码每次给我一个不同的百分比(我正在使用一个间隔)。我不知道怎么回事?

function onPlayerStateChange(event) {
    if (event.data == YT.PlayerState.PLAYING && !done) {
      clicked_video = true; 
      arr.length = (player.getDuration()-1).toFixed(0);
      done = true;

    }if(event.data === YT.PlayerState.PLAYING){

       id = setInterval(check, 1000);

   }if(event.data == YT.PlayerState.PAUSED || event.data == YT.PlayerState.BUFFERING){

        clearInterval(id);
        var percent = 0;
        for(var i=0;i<arr.length;i++){
          if(arr[i] == "x"){
          percent++;
          console.log(percent);
          }

       }

    percent = (percent / arr.length) * 100;
    alert(percent + "%");
    }
}
function check(){

      arr[Math.floor(player.getCurrentTime())] = "x";
}

6783
2018-02-26 19:55


起源

您谈论的是已观看视频的百分比,以及用户观看的时间。这是两件不同的事情。如果用户播放视频直到1:00然后回到0:30直到结束,该怎么办?你认为这是一个额外的,或者你只想要那一分钟? - blex
是的,我只想数一分钟。因此,用户观看视频的整体时间,然后我猜测后将其计算为百分比 - dantheman


答案:


这是一个演示,我认为变量和函数的名称足以理解所有内容,但如果您有任何疑问或问题,请继续问。

我必须提到的一点是 这不会是准确的。如果您的间隔每秒执行一次并且用户在中间跳过一部分,则可能不会计算该间隔。要获得更准确的百分比,您可以更频繁地执行您的间隔(这里100毫秒,来回观看视频时我得到97%),但要注意不要使用太多资源。

var player, timer, timeSpent = [], display = document.getElementById('display');

function onYouTubeIframeAPIReady() {
    player = new YT.Player( 'player', {
        events: { 'onStateChange': onPlayerStateChange }
    });
}

function onPlayerStateChange(event) {
    if(event.data === 1) { // Started playing
        if(!timeSpent.length){
            timeSpent = new Array( parseInt(player.getDuration()) );
        }
        timer = setInterval(record,100);
    } else {
        clearInterval(timer);
    }
}

function record(){
    timeSpent[ parseInt(player.getCurrentTime()) ] = true;
    showPercentage();
}

function showPercentage(){
    var percent = 0;
    for(var i=0, l=timeSpent.length; i<l; i++){
        if(timeSpent[i]) percent++;
    }
    percent = Math.round(percent / timeSpent.length * 100);
    display.innerHTML = percent + "%";
}

JS小提琴演示


9
2018-02-26 20:35



谢谢!非常有帮助。我仍然不太明白我做错了,但是你有可能解释我的问题吗? - dantheman
@dantheman是的,抱歉。好吧,因为你有一些未在你发布的代码中声明的变量,以及一些看起来不太有用的东西,我没有那么看。我确定的一件事是你无法设定 arr.length直接,你需要将值推到它,直到你得到所需的长度。 编辑 您可以通过执行操作来设置数组长度,而不是推送所有值 timeSpent = new Array( parseInt(player.getDuration()) );。 - blex
啊啊,我非常感谢你的帮助,我会给你的回答一个upvote,但显然我没有足够的“声誉”给那个XD - dantheman
如果我更改搜索(进度)栏,它不会改变哪个是坏的:) - Sai Teja Reddy
@SaiTejaReddy这是理想的行为。当您返回已经观看过的视频的一部分时,百分比不会改变(我们不想计算两次)。如果我们去一个尚未观看的部分,它确实增加了百分比。 - blex


这是一种方法,可以获得用户观看过多少视频的帧精确度:

食谱

/**
 *
 * @param {HTMLVideoElement} video
 * @returns {{total: number, percent: number}}
 */
function getPlayedTime(video) {
    var totalPlayed = 0;
    var played = video.played;

    for (var i = 0; i < played.length; i++) {
        totalPlayed += played.end(i) - played.start(i);
    }

    return {
        total: totalPlayed,
        percent: totalPlayed / video.duration * 100
    };
}

通过调用上面的辅助函数并将其传递给您的视频对象,您将获得一个具有两个属性的对象:用户实际观看的总长度(以秒为单位)以及此代表的视频持续时间的百分比。

这种方法很酷的是它100%准确。如果用户一遍又一遍地观看视频的前5秒,它仍然会注册只有5秒钟被观看。浏览器本身会跟踪这一点,因此您无需设置间隔,监听事件等。


3
2018-05-11 00:33



是否可以调整此代码以用于YouTube嵌入?我不知道如何/在哪里获得 video 我将作为参数传递给您的函数的对象。 - Ryan


Youtube iframe播放器api提供了一个功能来转换当前播放的视频时间 player.getCurrentTime():Number。这可以用于跟踪用户观看视频的程度。


0
2017-07-15 14:57