我有以下函数来计算视频的加载进度(很常见):
function updateProgressBar (video) {
if (video.buffered.length > 0) {
var percent = (video.buffered.end(0) / video.duration) * 100;
$('#loading').css({'width': percent + '%'});
console.log(percent);
if (percent == 100) {
console.log('video loaded!');
//everything is loaded, do something.
$(video).unbind('loadeddata canplaythrough playing'); //prevents the repetition of the callback
}
}
}
...在$(document).ready函数中绑定'progress'事件(以及其他一些安全措施):
var videoTest = document.getElementById("videoTest");
$('#videoTest').bind('progress', function () {
updateProgressBar (videoTest);
});
$('#videoTest').bind('loadeddata', function () {
updateProgressBar (videoTest);
});
$('#videoTest').bind('canplaythrough', function () {
updateProgressBar (videoTest);
});
$('#videoTest').bind('playing', function () {
updateProgressBar (videoTest);
});
您可以在此处查看实时示例: http://www.hidden-workshop.com/video/
正如你所看到的,它在firefox上运行良好,但在其他浏览器中,'percent'变量永远不会像预期的那样达到'100'的值;函数总是停在90~,因此我无法知道视频何时完成加载(对于我正在尝试做的事情至关重要)。
就像'progress'事件在我获得'%'的最终值之前停止工作,因为如果你点击'play'按钮,'playing'事件会触发,然后成功计算并读取'percent'变量的最后一个值(即100)。
我错过了什么,或者这是一个常见的问题?我可以使用任何解决方法吗?
提前致谢!
答案 0 :(得分:0)
var videoElement = null; //TODO set reference to video element
var checkVideoLoadingProgressTimerDelay = 50;
var checkVideoLoadingProgressTimerID = -1;
function getVideoLoadingProgress(){
var end = 0;
if(videoElement.buffered.length >= 1){
end = videoElement.buffered.end(0);
}
var progress = end / videoElement.duration;
progress = isNaN(progress) ? 0 : progress;
return progress;
};
function startCheckVideoLoadingProgressTimer(){
checkVideoLoadingProgressTimerID =
setTimeout(checkVideoLoadingProgressTimerHandler, checkVideoLoadingProgressTimerDelay);
};
function checkVideoLoadingProgressTimerHandler(){
var progress = getVideoLoadingProgress();
//TODO update progress bar
if(progress < 1){
startCheckVideoLoadingProgressTimer();
}
};
还为视频的“预加载”属性赋值“auto”,不保证用户代理将加载整个视频。