2016-03-02 25 views
7

Tôi gặp sự cố khi tìm kiếm video bằng Chrome.Tìm kiếm trong video HTML5 bằng Chrome

Đối với một số lý do, không có vấn đề gì tôi làm, video.seekable.end(0) luôn là 0.

Khi tôi gọi video.currentTime = 5, tiếp theo là console.log(video.currentTime), tôi thấy nó luôn luôn là 0, mà dường như để thiết lập lại các video.

Tôi đã thử cả định dạng webm của MP4 và VP9, ​​nhưng cả hai đều cho kết quả tương tự.

Điều gây phiền nhiễu hơn là Firefox chạy mọi thứ một cách hoàn hảo. Có điều gì đặc biệt về Chrome mà tôi nên biết không?

Dưới đây là mã của tôi (mà chỉ có tác dụng trong Firefox):

 <div class="myvideo"> 
     <video width="500" height="300" id="video1" preload="auto"> 
      <source src="data/video1.webm" type="video/webm"/> 
      Your browser does not support videos. 
     </video> 
     </div> 

Và đây là javascript:

var videoDiv = $(".myvideo").children().get(0) 
videoDiv.load(); 
    videoDiv.addEventListener("loadeddata", function(){ 
    console.log("loaded"); 
    console.log(videoDiv.seekable.end(0)); //Why is this always 0 in Chrome, but not Firefox? 
    videoDiv.currentTime = 5; 
    console.log(videoDiv.currentTime); //Why is this also always 0 in Chrome, but not Firefox? 
    }); 

Lưu ý rằng chỉ đơn giản gọi videoDiv.play() không thực sự chơi đúng video trong cả hai trình duyệt.

Ngoài ra, sau khi tệp phim được tải đầy đủ, videoDiv.buffered.end(0) cũng cung cấp các giá trị chính xác trong cả hai trình duyệt.

Trả lời

12

Tôi đã mất một lúc để tìm ra ...

Sự cố này hóa ra là phía máy chủ. Tôi đã sử dụng phiên bản Jetty để phục vụ tất cả các tệp video của mình. Cấu hình đơn giản của Cầu tàu không hỗ trợ byte serving.

Sự khác biệt giữa Firefox và Chrome là Firefox sẽ tải xuống toàn bộ tệp video để bạn có thể tìm kiếm thông qua nó, ngay cả khi máy chủ không hỗ trợ http code 206 (partial content). Mặt khác, Chrome từ chối tải xuống toàn bộ tệp (trừ khi nó thực sự nhỏ, như khoảng 2-3mb).

Vì vậy, để có được những currentTime thông số của video html5 được làm việc trong Chrome, bạn cần một máy chủ hỗ trợ mã http 206.

Đối với bất cứ ai khác có vấn đề này, bạn có thể kiểm tra cấu hình máy chủ của bạn với curl tăng gấp đôi:

curl -H Range:bytes=16- -I http://localhost:8080/GOPR0001.mp4 

Điều này sẽ trả lại mã 206. Nếu nó trả về mã 200, Chrome sẽ không thể tìm kiếm video, nhưng Firefox sẽ, do một giải pháp thay thế trong trình duyệt.

Và một mẹo cuối cùng: Bạn có thể sử dụng NPM http-server để có được một http-server đơn giản cho một thư mục địa phương hỗ trợ nội dung phần:

npm install http-server -g 

Và chạy nó để phục vụ cho một thư mục địa phương:

http-server -p 8000 
+0

Tôi gặp sự cố tương tự nhưng chỉ trên máy Mac. Chrome từ chối tìm kiếm, nhưng Firefox hoạt động. Tôi đang chạy một máy chủ tương thích http 206 trên máy tính của mình và tôi có thể thấy 206 yêu cầu trong nhật ký mạng. Có lẽ tôi nên hỏi một câu hỏi mới về SO cho việc này. –

+0

Bạn có nói rằng chúng tôi chỉ cần gửi mã trả lại là 206 để tính năng tìm kiếm hoạt động trong Chrome không? – vbNewbie

+0

Không, tôi nói rằng 206 là một cách để kiểm tra xem một phần nội dung có thể được lấy ra từ một máy chủ hay không. Nếu bạn đang viết máy chủ của riêng mình, bạn phải tuân thủ giao thức. Chrome sử dụng thông tin này để không phải tải xuống toàn bộ video trước khi phát trực tuyến. Nó hiệu quả. – Tovi7

0

Bạn có 3 khả năng cho thẻ Video: MP4, OGG, WebM.

Không phải tất cả các định dạng đều hoạt động trong tất cả các trình duyệt. Ở đây, tôi nghĩ rằng WebM hoạt động trong Firefox chứ không phải Chrome, vì vậy bạn nên cung cấp cả hai định dạng thay thế cho các tệp MP4 và WebM, bằng cách bao gồm thẻ Nguồn thứ hai đề cập đến tệp MP4.

Ví dụ: src = "data/video1.mp4" type = "video/mp4"

Phiên bản liên quan sẽ được trình duyệt tự động chọn.

+0

Như đã đề cập trong câu hỏi, tôi thực sự đã thử sử dụng mp4 trong chrome và không có sự khác biệt. Ngoài ra, nó sẽ làm tôi ngạc nhiên rằng webm sẽ không hoạt động trong Chrome, vì Google là động lực chính đằng sau toàn bộ định dạng. – Tovi7

+0

Xin lỗi - bạn nói đúng về cả hai tính - Tôi nên đọc câu hỏi trước - và vâng, Chrome chắc chắn phải đối phó với WebM. Có vẻ như Ian Devlin có câu trả lời đúng. Là một cách nhanh chóng sang một bên, tôi đã có vấn đề với các tệp MP4 không có định dạng H264 ... –

0

Tôi gặp sự cố tương tự. Tôi đã nghe một sự kiện kết thúc trên một video và đặt currentTime ở giữa video để lặp lại liên tục. Nó không hoạt động trong Safari hoặc Chrome.

Tôi nghĩ rằng có thể có lỗi trong Safari/Chrome, nơi thuộc tính vị trí playhead không khả dụng trừ khi phương tiện hiện đang phát.

Cách giải quyết của tôi là bắt đầu vòng lặp của tôi ngay trước khi kết thúc video và không cho phép kết thúc.

Hãy thử kiểm tra của bạn bằng cách bắt đầu phát lại trước và sau đó chạy fuction của bạn để xem nó có hoạt động trong Safari Chrome hay không.

+0

Đây là một gợi ý tuyệt vời, nhưng tiếc là nó không giúp đỡ cho vấn đề cụ thể của tôi. Cảm ơn mặc dù! – Tovi7

1

Nếu bạn đợi canplaythrough thay vì loadeddata, nó hoạt động.

Xem this codepen example.

+0

Tôi đã thử điều này, và tôi thậm chí không nhận thức được tài sản. Đề nghị tuyệt vời, nhưng tiếc là nó đã không sửa chữa trường hợp của tôi. Mặc dù vậy, tôi đã cố gắng giải quyết vấn đề, nhưng nó đã trở thành vấn đề phụ của máy chủ ... Tôi đã upvoted câu trả lời của bạn mặc dù tôi đã học được điều mới :-) – Tovi7

+0

bạn đã thiết lập cấu hình cầu nối như trên vì sử dụng gợi ý của bạn không hoạt động với tôi – vbNewbie

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