Ich versuche, eine sehr einfache HTML5-Seite einzurichten, die ein MP4-Video mit 20 MB lädt. Es scheint, dass der Browser das Ganze herunterladen muss, anstatt nur den ersten Teil des Videos abzuspielen und den Rest zu streamen.
Dieser Beitrag ist das Nächste, was ich bei der Suche gefunden habe ... Ich habe sowohl Handbremse als auch Data Go Round ausprobiert, da keiner der beiden einen Unterschied zu machen schien:
Irgendwelche Ideen, wie das geht oder ob es möglich ist?
Hier ist der Code, den ich verwende:
<video controls="controls">
<source src="/video.mp4" type="video/mp4" />
Your browser does not support the video tag.
</video>
quelle
boxdumper
, Atomic Parsley-T
und mp4v2mp4file --dump
.atomicparsley <filename> -T
(Die Optionen stehen ganz am Ende). Nochmals vielen Dank für die Hilfe @ mark4o!moov
am Anfang und nicht am Ende steht. Dies ermöglicht die Suche nach Bytebereichsanforderungen, bevor die gesamte Datei heruntergeladen wird. Wenn dies dazu führt, dass versucht wird, nicht zu funktionieren, suchen Sie in Ihrem Code nach einem Fehler, der die Bytebereichsanforderungen verarbeitet, der nicht verwendet wird, wenn dermoov
am Ende ist (zu dem Zeitpunkt, als er wusste, welche Bytes er benötigt, hätte er den bereits heruntergeladen ganze Datei). Ich sehe in Ihrer anderen Frage, dass Sie dafür benutzerdefinierten PHP-Code geschrieben haben.Hier ist die Lösung, mit der ich einen Web-API-Controller in C # (MVC) erstellt habe, der Videodateien mit Byte-Bereichen (Teilanforderungen) bereitstellt. Bei Teilanforderungen kann ein Browser nur so viel Video herunterladen, wie abgespielt werden muss, anstatt das gesamte Video herunterzuladen. Dies macht es weitaus effizienter.
Beachten Sie, dass dies nur in neueren Versionen funktioniert.
var stream = new FileStream(videoFilename, FileMode.Open, FileAccess.Read , FileShare.Read); var mediaType = MediaTypeHeaderValue.Parse($"video/{videoFormat}"); if (Request.Headers.Range != null) { try { var partialResponse = Request.CreateResponse(HttpStatusCode.PartialContent); partialResponse.Content = new ByteRangeStreamContent(stream, Request.Headers.Range, mediaType); return partialResponse; } catch (InvalidByteRangeException invalidByteRangeException) { return Request.CreateErrorResponse(invalidByteRangeException); } } else { // If it is not a range request we just send the whole thing as normal var fullResponse = Request.CreateResponse(HttpStatusCode.OK); fullResponse.Content = new StreamContent(stream); fullResponse.Content.Headers.ContentType = mediaType; return fullResponse; }
quelle