2013-08-15 44 views
19

Tôi đã xem một vài chủ đề về vấn đề này, nhưng không có câu trả lời, vì vậy tôi nghĩ tôi sẽ thêm một trang khác vào mộ của các trang liên quan đến ô nhiễm youtube.Khác: Buộc Chrome lưu toàn bộ video mp4

Tôi đã có một video mp4 100MB mà cần phải được đầy đủ tải bởi trình duyệt,

Tuy nhiên theres không có trường hợp cháy khi nó được tải về hoàn toàn, và Chrome dường như dừng lại đệm nữa của video cho đến khi thời gian video hiện tại gần như đã đạt đến cuối bộ đệm, sau đó nó yêu cầu nhiều hơn.

Làm cách nào để các trình duyệt tải xuống hoàn toàn video và lưu vào bộ đệm 100%?

Cảm ơn

Trả lời

37

Đáng buồn thay Chrome - như trình duyệt HTML5 khác - cố gắng để được thông minh về những gì nó tải về và tránh sử dụng băng thông không cần thiết ... điều này có nghĩa rằng đôi khi chúng ta đang trái với một kinh nghiệm phụ tối ưu (trớ trêu thay YouTube Điều này nói rằng, tôi đã không tìm thấy điều này được yêu cầu quá thường xuyên với một máy chủ tốt và một kết nối tốt - nhưng nếu bạn cần một cái gì đó, bạn cần phải thực hiện điều này một cách nhanh chóng. chỉ có giải pháp tôi đã tìm thấy là một chút của một sledgehammer ... sử dụng Ajax để tải về các tập tin mà bạn muốn chơi và sau đó tải đó vào nguồn cho các yếu tố video. Mẫu thử dưới đây giả định trình duyệt của bạn hỗ trợ m4v/mp4 - có thể bạn sẽ muốn sử dụng kiểm tra canPlayType để chọn định dạng video phù hợp nhất cho người dùng của mình nếu bạn không thể đảm bảo (ví dụ) Chrome. Bạn cũng sẽ muốn kiểm tra xem nó xử lý các video có kích thước như thế nào (tôi đã thử một số kích thước khá lớn nhưng không chắc chắn giới hạn trên sẽ được xử lý một cách đáng tin cậy)

Mẫu này cũng khá đơn giản. .. nó khởi động yêu cầu và không truyền đạt bất cứ điều gì cho người dùng khi đang tải - với video kích thước của bạn, bạn có thể muốn hiển thị thanh tiến trình chỉ để giữ cho họ quan tâm ...

Nhược điểm của quá trình này là nó sẽ không bắt đầu chơi cho đến khi bạn hoàn toàn tải xuống tệp - nếu bạn muốn đi sâu vào hiển thị video động từ bộ đệm của mình thì bạn sẽ cần phải bắt đầu delving vào cạnh chảy máu (tại thời điểm) thế giới của MediaSource như được mô tả trong các bài đăng như http://francisshanahan.com/index.php/2013/build-an-mpeg-dash-player-from-scratch/

<!DOCTYPE html> 
<html> 
<head> 
<title>Preload video via AJAX</title> 
</head> 
<body> 
<script> 
console.log("Downloading video...hellip;Please wait...") 
var xhr = new XMLHttpRequest(); 
xhr.open('GET', 'BigBuck.m4v', true); 
xhr.responseType = 'blob'; 
xhr.onload = function(e) { 
    if (this.status == 200) { 
    console.log("got it"); 
    var myBlob = this.response; 
    var vid = (window.webkitURL || window.URL).createObjectURL(myBlob); 
    // myBlob is now the blob that the object URL pointed to. 
    var video = document.getElementById("video"); 
    console.log("Loading video into element"); 
    video.src = vid; 
    // not needed if autoplay is set for the video element 
    // video.play() 
    } 
    } 

xhr.send(); 
</script> 

<video id="video" controls autoplay></video> 

</body> 
</html> 
2

Giải pháp của tôi dành cho video nhỏ hơn nhiều so với OP mô tả, ngăn video phát lại cho đến khi video được đệm hoàn toàn. Video sẽ phát cho người dùng cũ nếu video đã được lưu vào bộ nhớ cache.

Câu trả lời dưới đây bị ảnh hưởng nặng nề bởi điều này answer và đã được thử nghiệm trên Chrome, Safari và Firefox. tập tin

Javascript:

$(document).ready(function(){ 
     // The video_length_round variable is video specific. 
     // In this example the video is 10.88 seconds long, rounded up to 11. 
     var video_length_round = 11; 

     var video = document.getElementById('home_video_element'); 
     var mp4Source = document.getElementById('mp4Source'); 

     // Ensure home_video_element present on page 
     if(typeof video !== 'undefined'){ 

     // Ensure video element has an mp4Source, if so then update video src 
     if(typeof mp4Source !== 'undefined'){ 
      $(mp4Source).attr('src', '/assets/homepage_video.mp4'); 
     } 

     video.load(); 

     // Ensure video is fully buffered before playing 
     video.addEventListener("canplay", function() { 
      this.removeEventListener("canplay", arguments.callee, false); 

      if(Math.round(video.buffered.end(0)) >= video_length_round){ 
      // Video is already loaded 
      this.play(); 

      } else { 
      // Monitor video buffer progress before playing 
      video.addEventListener("progress", function() { 
       if(Math.round(video.buffered.end(0)) == video_length_round){ 
       this.removeEventListener("progress", arguments.callee, false); 
       video.play(); 
       } 
      }, false); 
      } 
     }, false); 
     } 
    }); 

Trên javascript cập nhật nguồn gốc của phần tử video như thế này một:

<video id="home_video_element" loop="" poster="/assets/home/video_poster_name.jpg" preload="auto"> 
     <source id="mp4Source" type="video/mp4"> 
    </video> 
Các vấn đề liên quan