Fully buffer video in Chrome

后端 未结 5 2002
我在风中等你
我在风中等你 2021-02-07 16:01

Is it possible to fully buffer HTML5 video in Chrome (and Opera)?

I host the movie in .mp4 and .webm on amazon S3. In HTML I use standard tag.

相关标签:
5条回答
  • 2021-02-07 16:13

    Have you tried the canplaythrough event?

    Not in the traditional sense, I mean. Rather in a 'hacky' way. canplaythrough is triggered when the browser detects that it has enough video buffered to play continuously without pausing. I am guessing that this event triggers about the same time as chrome pauses buffering. If that's the case, it could be use to trigger a request for rest of the video.

    0 讨论(0)
  • Be careful using video.buffered.end(0). According to my experience, it works with Chrome but it fails with IE9.

    I don't know what happens, IE9 seems to forget to do the last update to video.buffered.end() at the end of the buffering process and the video.buffered.end(0) is a little bit smaller than video.duration.

    So, if you think your page could be used with another browser than Chrome, don't use video.buffered.end(0).

    0 讨论(0)
  • 2021-02-07 16:30

    Because S3 supports partial downloads, Chrome initially buffers "only what's needed" in front of the playhead and then stops buffering. It will continue buffering "only what's needed" when the video starts playing. This means that depending on the user's download speed it will stop buffering now and then, just because it has enough buffer to play continuously.

    But if you pause the video after having played some, Chrome will not stop buffering and go through all the way to the end.

    This example exploits that technique to entirely buffer the video off screen before showing it on the page.

    Tested on Chrome 32

    // Create video in background and start playing
    var video = document.createElement('video');
    video.src = 'video.mp4';
    video.controls = true;
    video.muted = true; 
    video.play();
    
    // Pause immediately after it starts playing.
    video.addEventListener("timeupdate", function() {
        if (this.currentTime > 0) {
    
            this.pause();
            video.muted = false;
            video.currentTime = 0
            this.removeEventListener("timeupdate", arguments.callee, false);
    
            // When whole video is buffered, show video on page
            video.addEventListener("progress", function() {
                if (Math.round(video.buffered.end(0)) / Math.round(video.seekable.end(0)) == 1) {
                    document.body.appendChild(video);
                    this.removeEventListener("progress", arguments.callee, false);
                }
            }, false);
        }
    }, false);
    
    0 讨论(0)
  • 2021-02-07 16:39

    I have not tried it, but the HTML5 video object contains a buffered property

    var video = document.createElement('video');
    video.buffered.start(0);
    video.buffered.end(0);
    

    Could you try monitoring the buffered (Such as with this thread chrome html5 video buffered.end event)

    Then continually change the current time to right before the buffered time using

    video.currentTime = video.buffered.end(0) - 1;
    
    0 讨论(0)
  • 2021-02-07 16:39

    There are several ways to load a video all the way then play it:
    1. There is the goody goody browser developer would be proud way:

    var video = document.createElement('video');
    video.src='myvideo.mp4';
    document.appendChild(video);
    video.load();
    video.addEventListener('loadedmeta',function(){
    video.play()
    });
    

    2. And there is the lazy "But, I'll get carpel tunnel!" developer way:

    <video src='myvideo.mp4' onloadedmeta='this.play()' preload></video>
    

    Sources:
    http://www.w3schools.com/tags/tag_video.asp
    how to run js code when video is fully buffered/loaded
    How do I add new Video entirely from JavaScript?
    javascript with html <video> load() & play() function not firing http://www.w3.org/wiki/HTML/Elements/video

    0 讨论(0)
提交回复
热议问题