2015-04-20 36 views
4

我使用video.js(http://www.videojs.com/)構建視頻審批系統並需要在播放器中記錄用戶操作。我可以輕鬆地做到這一點,播放,暫停,結束等,但嘗試登錄時發現問題。video.js - 播放期間查找搜索的開始時間

我希望能夠記錄plaback內任何搜索的開始和結束時間,因此我們知道用戶是否實際上沒有觀看過某段視頻。玩家似乎提供支持這個事件的事件,但我正在努力從它獲得正確的時間。

當用戶跳過視頻時,播放器按順序發出以下事件:暫停,搜索,查找,播放。

如果我使用currentTime()在任何事件中查詢播放器對象,則結果始終是搜索的結束時間,即使在最初的暫停事件中也是如此。這意味着我可以記錄搜索結束的位置,但不是它開始的位置。

任何人都可以幫助我找到尋找視頻的位置嗎?

如果這是不可能的,我會解決在播放過程中禁用搜索的方法。

編輯:按要求添加代碼。這很簡單:

var trackedPlayer = videojs('pvp-player'); 

trackedPlayer.on("play", function (e) { 
    console.log("Video playback started: " + trackedPlayer.currentTime()); 
}); 

trackedPlayer.on("pause", function (e) { 
    console.log("Video playback paused: " + trackedPlayer.currentTime()); 
}); 

trackedPlayer.on("seeking", function (e) { 
    console.log("Video seeking: " + trackedPlayer.currentTime()); 
}); 


trackedPlayer.on("seeked", function (e) { 
    console.log("Video seek ended: " + trackedPlayer.currentTime()); 
}); 

trackedPlayer.on("ended", function (e) { 
    console.log("Video playback ended."); 
}); 

如果我能得到我想要的所有跟蹤,我會用ajax調用來替換console.log來存儲數據。

+0

你能告訴我們一些關於在哪裏以及如何將事件處理程序附加到播放器的代碼嗎? –

回答

-1

請試着用此代碼知道視頻的長度。

var duration = document.getElementById("duration"); 
var vid_duration = Math.round(document.getElementById("video").duration); 
    //alert(vid_duration); 
duration.innerHTML = vid_duration; 
    //duration.firstChild.nodeValue = vid_duration; 
+0

問題是關於在找到播放頭之前找出播放頭的位置並且與播放時間無關。 –

+0

@Raphael Schweikert,我的壞:) – stanze

4

你可以聽timeupdate UND把你旁邊seeking前到了那裏最後的值被稱爲源:

var previousTime = 0; 
var currentTime = 0; 
trackedPlayer.on('timeupdate', function() { 
    previousTime = currentTime; 
    currentTime = trackedPlayer.currentTime(); 
}); 
trackedPlayer.on('seeking', function() { 
    console.log('seeking from', previousTime, 'to', currentTime, '; delta:', currentTime - previousTime); 
}); 

這似乎與HTML5技術工作。我還沒有與其他技術人員進行過測試。

但是,有一個小故障:第一次尋找暫停球員只產生一個小的三角洲(和兩個變量的幾乎相同的前值)。但這應該沒什麼大不了,因爲三角洲只有幾百毫秒(我收集你只對「from」值感興趣)。

更新

seeked遠遠高於不常觸發seeking。嘗試以下操作。

var previousTime = 0; 
var currentTime = 0; 
var seekStart = null; 
trackedPlayer.on('timeupdate', function() { 
    previousTime = currentTime; 
    currentTime = trackedPlayer.currentTime(); 
}); 
trackedPlayer.on('seeking', function() { 
    if(seekStart === null) { 
     seekStart = previousTime; 
    } 
}); 
trackedPlayer.on('seeked', function() { 
    console.log('seeked from', seekStart, 'to', currentTime, '; delta:', currentTime - previousTime); 
    seekStart = null; 
}); 

還有很多用於去除函數調用的函數庫(在這種情況下是對後端的調用)。

+0

我一直在玩這個;當用戶拖動滑塊時會產生整條船的載入 - timeupdate可以每隔15ms觸發一次,當用戶通過30分鐘的視頻擦洗時會產生太多的事件 - 每次事件發生時都不可行阿賈克斯電話:) 感謝您的建議。 –

+0

@DaveTheButcher看到我的更新 –

0

我需要爲我正在處理的項目找到相同的值,以便我可以確定用戶是否在videojs播放器中向前或向後跳過。

起初,我以爲保存用戶正在尋求從的currentTime的()上timeupdate然後立即刪除我的timeupdate聽衆一次尋求被派遣。雖然這在Chrome等瀏覽器中很有效,但我發現其他瀏覽器會繼續更頻繁地啓動timeupdate,並會繼續更新玩家真正查找後保存的currentTime()。

這是最終在Safari/Chrome/Firefox上運行的解決方案。我還沒有在IE中測試。

var previousTime = 0, 
    currentTime = 0, 
    completeTime = 0, 
    position = 0; 


trackedPlayer.on('timeupdate', function() { 
    previousTime = currentTime; 
    currentTime = Math.floor(player.currentTime()); 

    // save 'position' so long as time is moving forward with each update 
    if (previousTime < currentTime) { 
     position = previousTime; 
     previousTime = currentTime; 
    } 
}); 

// when seeking starts 
trackedPlayer.on('seeking', function() { 
    player.off('timeupdate', onTimeUpdate); 

    player.one('seeked', onSeekComplete); 
}); 

// when seeking completes 
trackedPlayer.on('seeked', function() { 
    completeTime = Math.floor(player.currentTime()); 
    console.log("User came from: " + position); 
    console.log("User ended at: " + completeTime); 
}); 
0

我知道這是一箇舊的帖子,但這是唯一的解決方案,爲我工作。

var counter = 0; 
var beforeTimeChange = 0; 

function handleSeeking() { 
    var timeoutTime = 300; 
    var beforeCounter = counter + 1; 
    if (trackedPlayer.cache_.currentTime === trackedPlayer.duration()) { 
    return; 
    // when video starts over, calls seek 
    } 
    beforeTimeChange = beforeTimeChange || trackedPlayer.cache_.currentTime; 
    setTimeout(function() { 
    if (beforeCounter === counter) { 
     console.log('before seek', beforeTimeChange, '\nafter seek', trackedPlayer.currentTime() - (timeoutTime/1000)); 
     counter = 0; 
     beforeTimeChange = 0; 
    } 
    }, timeoutTime); 
    counter++; 
} 

trackedPlayer.on('seeking', handleSeeking); 
相關問題