html5-视频下载进度只适用于firefox

时间:2011-12-25 22:45:29

标签: javascript jquery html5-video

我有以下函数来计算视频的加载进度(很常见):

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)。

我错过了什么,或者这是一个常见的问题?我可以使用任何解决方法吗?

提前致谢!

1 个答案:

答案 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”,不保证用户代理将加载整个视频。