Wie Wrikken vorgeschlagen hat, handelt es sich um eine gültige Anfrage. Es kommt auch häufig vor, dass der Client Medien anfordert oder den Download fortsetzt.
Ein Client testet häufig, ob der Server andere Fernkampfanforderungen verarbeitet als nur nach einer Accept-Ranges
Antwort zu suchen . Chrome sendet immer eine Range: bytes=0-
erste GET-Anfrage für ein Video, sodass Sie diese nicht ablehnen können.
Immer wenn ein Client Range:
in seine Anfrage einschließt , selbst wenn er fehlerhaft ist, erwartet er eine teilweise inhaltliche Antwort (206). Wenn Sie während der HTML5-Videowiedergabe nach vorne suchen, fordert der Browser nur den Startpunkt an. Zum Beispiel:
Range: bytes=3744-
Damit der Client Videos ordnungsgemäß abspielen kann, muss Ihr Server in der Lage sein, diese unvollständigen Bereichsanforderungen zu verarbeiten.
Sie können den in Ihrer Frage angegebenen Typ des Bereichs auf zwei Arten behandeln:
Zuerst können Sie mit dem in der Antwort angegebenen angeforderten Startpunkt antworten, dann mit der Gesamtlänge der Datei minus eins (der angeforderte Bytebereich ist nullindiziert). Zum Beispiel:
Anfrage:
GET /BigBuckBunny_320x180.mp4
Range: bytes=100-
Antwort:
206 Partial Content
Content-Type: video/mp4
Content-Length: 64656927
Accept-Ranges: bytes
Content-Range: bytes 100-64656926/64656927
Zweitens könnten Sie mit dem in der Anfrage angegebenen Ausgangspunkt und einer offenen Dateilänge (Größe) antworten. Dies gilt für Webcasts oder andere Medien, bei denen die Gesamtlänge unbekannt ist. Zum Beispiel:
Anfrage:
GET /BigBuckBunny_320x180.mp4
Range: bytes=100-
Antwort:
206 Partial Content
Content-Type: video/mp4
Content-Length: 64656927
Accept-Ranges: bytes
Content-Range: bytes 100-64656926/*
Tipps:
Sie müssen immer mit der im Bereich enthaltenen Inhaltslänge antworten. Wenn der Bereich mit Anfang bis Ende vollständig ist, ist die Inhaltslänge einfach der Unterschied:
Anfrage: Bereich: Bytes = 500-1000
Antwort: Inhaltsbereich: Bytes 500-1000 / 123456
Denken Sie daran, dass der Bereich auf Null indiziert ist und daher Range: bytes=0-999
tatsächlich 1000 Bytes und nicht 999 Bytes anfordert. Antworten Sie also mit etwas wie:
Content-Length: 1000
Content-Range: bytes 0-999/123456
Oder:
Content-Length: 1000
Content-Range: bytes 0-999/*
Vermeiden Sie jedoch nach Möglichkeit die letztere Methode, da einige Mediaplayer versuchen, die Dauer anhand der Dateigröße zu ermitteln. Wenn Ihre Anfrage Medieninhalte betrifft, was meine Vermutung ist, sollten Sie deren Dauer in die Antwort aufnehmen. Dies erfolgt im folgenden Format:
X-Content-Duration: 63.23
Dies muss ein Gleitkomma sein. Im Gegensatz dazu Content-Length
muss dieser Wert nicht genau sein. Es wird verwendet, um dem Player beim Suchen im Video zu helfen. Wenn Sie einen Webcast streamen und nur eine allgemeine Vorstellung davon haben, wie lange er dauern wird, ist es besser, Ihre geschätzte Dauer anzugeben, als sie insgesamt zu ignorieren. Für einen zweistündigen Webcast können Sie also Folgendes hinzufügen:
X-Content-Duration: 7200.00
Bei einigen Medientypen, z. B. webm, müssen Sie auch den Inhaltstyp angeben, z.
Content-Type: video/webm
All dies ist erforderlich, damit die Medien ordnungsgemäß abgespielt werden können, insbesondere in HTML5. Wenn Sie keine Dauer angeben, versucht der Player möglicherweise, die Dauer (um das Suchen zu ermöglichen) anhand der Dateigröße zu ermitteln. Dies ist jedoch nicht korrekt. Dies ist in Ordnung und für Webcasts oder Live-Streaming erforderlich, jedoch nicht ideal für die Wiedergabe von Videodateien. Sie können die Dauer mit Software wie FFMPEG extrahieren und in einer Datenbank oder sogar im Dateinamen speichern.
X-Content-Duration
wird zugunsten von auslaufen Content-Duration
, also würde ich das auch einschließen. Eine grundlegende Antwort auf eine "0-" Anfrage würde mindestens Folgendes umfassen:
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
Noch ein Punkt: Chrome startet seine erste Videoanfrage immer mit folgendem:
Range: bytes=0-
Einige Server senden eine reguläre 200-Antwort als Antwort, die sie akzeptiert (jedoch mit eingeschränkten Wiedergabeoptionen). Versuchen Sie jedoch, stattdessen eine 206 zu senden, um anzuzeigen, dass Ihr Server Bereiche verarbeitet. Laut RFC 2616 ist es akzeptabel, Bereichskopfzeilen zu ignorieren.