Youtube iframe javascript,跟踪观看视频的百分比?

Youtube iframe javascript,跟踪观看视频的百分比?,javascript,youtube,Javascript,Youtube,我试图准确计算用户观看视频的时间。他们观看视频的时间不应包括向前跳过或视频暂停。我现在的代码每次都给我一个不同的百分比(我使用的是一个区间)。我不知道该怎么办 function onPlayerStateChange(event) { if (event.data == YT.PlayerState.PLAYING && !done) { clicked_video = true; arr.length = (player.getDuration

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

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";
}
函数onPlayerStateChange(事件){
如果(event.data==YT.PlayerState.PLAYING&&!done){
单击_video=true;
arr.length=(player.getDuration()-1).toFixed(0);
完成=正确;
}如果(event.data==YT.PlayerState.PLAYING){
id=设置间隔(检查,1000);
}if(event.data==YT.PlayerState.PAUSED | | event.data==YT.PlayerState.BUFFERING){
清除间隔(id);
风险值百分比=0;

对于(var i=0;i这里是一个演示,我认为变量和函数的名称足够明确,可以理解所有内容,但是如果您有任何问题,请继续提问

<> P>>我必须提到的是,<强>它不会是精确的<强>。如果你的间隔每秒执行一次,而用户在一秒内跳过一个部分,那一个可能不被计数。为了有一个更准确的百分比,你可以更频繁地执行你的间隔(这里100m,我来回看视频时得到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 + "%";
}
var播放器,计时器,timespunt=[],display=document.getElementById('display');
函数onyoutubeiframeapiredy(){
player=新的YT.player('player'{
事件:{'onStateChange':onPlayerStateChange}
});
}
函数onPlayerStateChange(事件){
如果(event.data==1){//开始播放
如果(!timeSpent.length){
timeSpent=新数组(parseInt(player.getDuration());
}
定时器=设置间隔(记录,100);
}否则{
清除间隔(计时器);
}
}
函数记录(){
timespunt[parseInt(player.getCurrentTime())]=true;
showPercentage();
}
函数showPercentage(){
风险值百分比=0;

对于(var i=0,l=timespunt.length;i,这里有一种方法可以获得用户观看视频量的完美帧精度:

食谱
  • 获取HTML5视频播放器的参考
  • 从视频对象中抓取
    播放的
    属性,该属性返回一个
    时间范围
    对象(请参阅)
  • 迭代播放的
    对象,并将所有范围相加
例子
/**
*
*@param{HTMLVideoElement}视频
*@returns{{total:number,percent:number}
*/
函数getPlayedTime(视频){
var=0;
var played=video.played;
for(变量i=0;i
通过调用上面的helper函数并将其传递给您的视频对象,您将获得一个具有两个属性的对象:用户实际观看的总长度(以秒为单位)以及这表示的视频持续时间百分比


这种方法最酷的一点是,它100%准确。如果用户反复观看视频的前5秒,它仍然会记录只有5秒被观看。浏览器本身会跟踪这一点,因此您不需要设置间隔、侦听事件等。Youtube iframe player api提供了一个可切换的功能视频的当前播放时间
player.getCurrentTime():Number
。可用于跟踪用户观看视频的时间。

您指的是已观看视频的百分比,以及用户观看视频的时间。这是两件不同的事情。如果用户将视频播放到1:00,然后返回到0:30直到结束,该怎么办?您是否将其视为额外的,或你只想计算一分钟吗?是的,我只想计算一分钟。因此,用户观看视频的总时间,然后计算成一个百分比,我猜谢谢!非常有用。我仍然不太明白我做错了什么,但是,你能解释我的问题吗?@dantheman是的,很抱歉帽子。嗯,由于您发布的代码中有一些变量没有声明,而且有些东西乍一看似乎没有什么用处,所以我没有看太多。有一件事我确信,您不能直接设置
arr.length
,您需要将值推送到它,直到获得所需的长度。编辑而不是推送所有值嗯,你可以通过执行
timespunt=new array(parseInt(player.getDuration());
设置数组长度。啊哈,我明白了,非常感谢你的帮助,我会给你的答案投上一票,但显然我没有足够的“声誉”来进行设置。如果我更改seek(progress)栏,它不会改变,这是不好的:)@SaiTejaReddy这是你想要的行为。当你回到视频中已经观看的部分时,百分比不会改变(我们不想重复计算)。如果我们转到一个尚未观看的部分,它确实会增加百分比。是否可以将此代码改编为用于YouTube嵌入?我不知道如何/从何处获取作为函数参数传递的
视频对象。这种方法的问题是,如果我在以前播放的片段中重播视频,例如,如果我在第4秒重新启动段[0..8]中的视频,播放的视频将不会创建新段,它将继续在同一段中计数。例如,如果我在第4秒重新启动,并继续播放到第13秒,段[0..8]将变为[0..13]。这是有意义的,因为played属性告诉我们在媒体中播放了哪些时间范围。
/**
 *
 * @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
    };
}