2011-09-06 29 views
30

Tôi tự hỏi nếu có cách nào đơn giản để đạt được hiệu ứng này, không cần mã phụ trợ để trích xuất khung, hãy lưu nó dưới dạng jpg và cơ sở dữ liệu ở đâu đó.Tự động sử dụng khung hình đầu tiên làm áp phích trong video HTML5?

Hiệu ứng nhờ đó khung đầu tiên của video chỉ hiển thị dưới dạng áp phích khi video tải sẽ hữu ích (nó sẽ chỉ hoạt động nếu trình duyệt có thể phát lại video rõ ràng, có thể hơi khác so với cách poster truyền thống hoạt động, nhưng đó không phải là một mối quan tâm.

Trả lời

19

có một plugin Popcorn.js gọi Popcorn.capture mà sẽ cho phép bạn tạo ra các áp phích từ bất kỳ khung video HTML5 của mình.

có một hạn chế được áp đặt bởi trình duyệt cấm đọc dữ liệu pixel của tài nguyên được yêu cầu trên các tên miền (sử dụng API canvas để ghi lại giá trị hiện tại của một khung). Video nguồn phải được lưu trữ trên cùng một tên miền như tập lệnh và trang html đang yêu cầu nó cho phương pháp này hoạt động.

Mã để tạo ra poster sử dụng plugin này khá đơn giản:

// This block of code must be run _after_ the DOM is ready 
// This will capture the frame at the 10th second and create a poster 
var video = Popcorn("#video-id"); 

// Once the video has loaded into memory, we can capture the poster 
video.listen("canplayall", function() { 

    this.currentTime(10).capture(); 

}); 
+0

trông giống như những gì tôi cần. Không thể nhận được bỏng ngô để làm việc không may .. nhận được 'Lỗi bắt buộc: INVALID_STATE_ERR: DOM Ngoại lệ 11 popcorn.js: 389 Popcorn.extend.Popcorn.forEach.ret popcorn.js: 389' bất cứ khi nào tôi gọi nó. – Damon

+0

Có vẻ như bạn không đợi video được tải. Tôi đã cập nhật ví dụ mã ở trên để chờ sau đó đặt áp phích. – Rick

+1

cảm ơn .. đã làm cho nó hoạt động. cho hầu hết các phần anyway .. tôi đã theo ấn tượng từ các tài liệu rằng 'this.capture ({at: 1}). currentTime (0);' sẽ lấy một poster từ 1 giây trong và sau đó đưa video vào đầu nhưng nó để nó ở 1 giây. Bạn có kinh nghiệm gì không? – Damon

6

Bạn có thể đặt preload='auto' trên các yếu tố video để tải các khung đầu tiên của video tự động.

+0

Chỉ cần một lời khuyên: tải trước có nghĩa là video có thể được tải xuống tự động mà không có hành động của người dùng. Đó là những gì xảy ra theo mặc định trên Chrome, Firefox và IE trên máy tính để bàn. Vì vậy, hãy chắc chắn nó sẽ không làm trầm trọng thêm trải nghiệm người dùng trên trang của bạn. – Louhike

+1

Điểm tốt mặc dù đây là trường hợp duy nhất trên máy tính để bàn vì đây là một gợi ý, không phải là chỉ thị. Hơi lỗi thời nhưng hãy xem https://www.stevesouders.com/blog/2013/04/12/html5-video-preload/ –

8

Gần đây, tôi đã thực hiện việc này cho một dự án gần đây hoạt động trên máy tính để bàn và thiết bị di động. Bí quyết đã làm cho nó hoạt động trên iPhone.

Đặt preload=metadata hoạt động trên máy tính để bàn và thiết bị Android chứ không phải iPhone.

Đối với iPhone, tôi phải đặt thành autoplay để hình ảnh áp phích tự động xuất hiện khi tải ban đầu. iPhone sẽ ngăn video tự động phát nhưng hình ảnh áp phích xuất hiện dưới dạng kết quả.

Tôi đã phải kiểm tra iPhone bằng câu trả lời của Pavan được tìm thấy tại đây. Detect iPhone Browser. Sau đó, sử dụng thẻ video phù hợp có hoặc không có autoplay tùy thuộc vào thiết bị.

var agent = navigator.userAgent; 
var isIphone = ((agent.indexOf('iPhone') != -1) || (agent.indexOf('iPod') != -1)) ; 

$videoTag = ""; 
if(isIphone()) { 
    $videoTag = '<video controls autoplay preload="metadata">'; 
} else { 
    $videoTag = '<video controls preload="metadata">'; 
} 
+1

Câu trả lời này giải thích lý do sự cố xảy ra và cung cấp một công việc xung quanh.Hãy nhớ rằng trong iOS 10 thuộc tính autoplay có thể được vinh danh nếu một số điều kiện được đáp ứng. Vì vậy, tôi khuyên mọi người nên tạm dừng video ngay lập tức để ngăn không cho phát tự động thực sự. –

+0

@Alessandro bạn có thể hiển thị một số mã như thế nào chúng tôi có thể xử lý này trong ios 10 nó sẽ là tuyệt vời Cảm ơn – Mourice

+1

một cái gì đó như 'var video = document.createElement ('video'); video.controls = true; video.preload = 'metadata'; if (isIphone) {video.autoplay = true; video.pause(); } ' –

Các vấn đề liên quan