Như Wrikken đã đề xuất, đó là một yêu cầu hợp lệ. Nó cũng khá phổ biến khi khách hàng yêu cầu phương tiện hoặc tiếp tục tải xuống.
Một máy khách thường sẽ kiểm tra xem máy chủ có xử lý các yêu cầu khác nhau không ngoài việc chỉ tìm kiếm Accept-Ranges
phản hồi. Chrome luôn gửi Range: bytes=0-
yêu cầu GET đầu tiên cho một video, vì vậy, đó là thứ bạn không thể loại bỏ.
Bất cứ khi nào khách hàng đưa Range:
vào yêu cầu của mình, ngay cả khi nó không đúng định dạng, nó sẽ mong đợi một phần nội dung (206) phản hồi. Khi bạn tìm kiếm về phía trước trong khi phát lại video HTML5, trình duyệt chỉ yêu cầu điểm bắt đầu. Ví dụ:
Range: bytes=3744-
Vì vậy, để máy khách phát video đúng cách, máy chủ của bạn phải có khả năng xử lý các yêu cầu phạm vi không đầy đủ này.
Bạn có thể xử lý loại 'phạm vi' mà bạn đã chỉ định trong câu hỏi của mình theo hai cách:
Đầu tiên, Bạn có thể trả lời với điểm bắt đầu được yêu cầu được đưa ra trong phản hồi, sau đó tổng độ dài của tệp trừ đi một (phạm vi byte được yêu cầu được lập chỉ mục bằng 0). Ví dụ:
Yêu cầu:
GET /BigBuckBunny_320x180.mp4
Range: bytes=100-
Phản ứng:
206 Partial Content
Content-Type: video/mp4
Content-Length: 64656927
Accept-Ranges: bytes
Content-Range: bytes 100-64656926/64656927
Thứ hai, bạn có thể trả lời với điểm bắt đầu được đưa ra trong yêu cầu và độ dài (kích thước) tệp kết thúc mở. Điều này dành cho webcast hoặc phương tiện khác mà tổng thời lượng không xác định. Ví dụ:
Yêu cầu:
GET /BigBuckBunny_320x180.mp4
Range: bytes=100-
Phản ứng:
206 Partial Content
Content-Type: video/mp4
Content-Length: 64656927
Accept-Ranges: bytes
Content-Range: bytes 100-64656926/*
Lời khuyên:
Bạn phải luôn trả lời với độ dài nội dung đi kèm với phạm vi. Nếu phạm vi hoàn chỉnh, có bắt đầu đến kết thúc, thì độ dài nội dung chỉ đơn giản là sự khác biệt:
Yêu cầu: Phạm vi: byte = 500-1000
Phản hồi: Phạm vi nội dung: byte 500-1000 / 123456
Hãy nhớ rằng phạm vi được lập chỉ mục bằng 0, vì vậy Range: bytes=0-999
thực sự yêu cầu 1000 byte, không phải 999, vì vậy hãy trả lời bằng một cái gì đó như:
Content-Length: 1000
Content-Range: bytes 0-999/123456
Hoặc là:
Content-Length: 1000
Content-Range: bytes 0-999/*
Tuy nhiên, hãy tránh phương pháp sau nếu có thể vì một số trình phát đa phương tiện cố gắng tìm ra thời lượng từ kích thước tệp. Nếu yêu cầu của bạn dành cho nội dung truyền thông, đó là linh cảm của tôi, thì bạn nên đưa thời lượng của nó vào phản hồi. Điều này được thực hiện với định dạng sau:
X-Content-Duration: 63.23
Đây phải là một dấu chấm động. Không giống như Content-Length
, giá trị này không cần phải chính xác. Nó được sử dụng để giúp người chơi tìm kiếm xung quanh video. Nếu bạn đang phát trực tuyến một webcast và chỉ có ý tưởng chung về thời lượng của nó, tốt hơn là bạn nên bao gồm thời lượng ước tính của mình hơn là bỏ qua hoàn toàn. Vì vậy, đối với một webcast dài hai giờ, bạn có thể bao gồm một số thứ như:
X-Content-Duration: 7200.00
Với một số loại phương tiện, chẳng hạn như webm, bạn cũng phải bao gồm loại nội dung, chẳng hạn như:
Content-Type: video/webm
Tất cả những điều này đều cần thiết để phương tiện phát đúng cách, đặc biệt là trong HTML5. Nếu bạn không đưa ra thời lượng, người chơi có thể cố gắng tìm ra thời lượng (để cho phép tìm kiếm) từ kích thước tệp của nó, nhưng điều này sẽ không chính xác. Điều này là tốt và cần thiết cho webcast hoặc phát trực tiếp, nhưng không lý tưởng để phát lại các tệp video. Bạn có thể trích xuất thời lượng bằng phần mềm như FFMPEG và lưu nó vào cơ sở dữ liệu hoặc thậm chí là tên tệp.
X-Content-Duration
đang được loại bỏ để ủng hộ Content-Duration
, vì vậy tôi cũng sẽ bao gồm điều đó. Một phản hồi cơ bản cho yêu cầu "0-" sẽ bao gồm ít nhất những điều sau:
HTTP/1.1 206 Partial Content
Date: Sun, 08 May 2013 06:37:54 GMT
Server: Apache/2.0.52 (Red Hat)
Accept-Ranges: bytes
Content-Length: 3980
Content-Range: bytes 0-3979/3980
Content-Type: video/webm
X-Content-Duration: 2054.53
Content-Duration: 2054.53
Một điểm nữa: Chrome luôn bắt đầu yêu cầu video đầu tiên với những điều sau:
Range: bytes=0-
Một số máy chủ sẽ gửi một phản hồi 200 thông thường dưới dạng một phản hồi mà nó chấp nhận (nhưng với các tùy chọn phát lại hạn chế), nhưng hãy thử gửi 206 thay thế để hiển thị hơn phạm vi xử lý của máy chủ của bạn. RFC 2616 cho biết có thể chấp nhận bỏ qua các tiêu đề phạm vi.