Ich denke, meine Frage ist ziemlich einfach …
Manchmal lade ich gerne große MKV-Dateien von einem meiner Webserver herunter und spiele sie während des Downloads ab. Wenn ich dies jedoch mit MKV-Dateien mache, die ich transkodiert habe, wird die Datei oft als viel kürzer angezeigt, als sie tatsächlich ist, und wenn sie am Ende angekommen ist, wird die Wiedergabe einfach fortgesetzt und eine falsche Zeit angezeigt. Beispielsweise wird 2:50/2:50 angezeigt, aber die Wiedergabe läuft weiter. Wenn ich jedoch versuche, mit den Pfeiltasten rückwärts zu spulen, stürzt der Player entweder ab oder springt zurück zum Anfang der Datei.
Wie kann ich also beim Kodieren alle Metadaten an den Anfang der Datei verschieben, sodass der Player die Länge der Datei erkennt, ohne über die gesamte Datei zu verfügen?Dies können Sie mit dem Format tun, mp4
indem Sie-movflags faststart
, aber wie macht man das für mkv
?
Es tut mir leid, wenn diese Frage bereits woanders gestellt und beantwortet wurde. Mir sind keine besseren Schlüsselwörter eingefallen als die, die ich verwendet habe, und die, die ich verwendet habe, haben zu keinen Ergebnissen geführt.
Antwort1
Die Matroska-Stiftung bietet ein Tool,Abonnieren, das eine ähnliche Aufgabe ausführt wie qt-faststart für MOV/MP4s.
Syntax:
mkclean in.mkv out.mkv
Dadurch wird der Cue-Index neu generiert. Um die ursprünglichen Cues beizubehalten,
mkclean --keep-cues in.mkv out.mkv
FFmpeg kann auchDas, mit einigen Vermutungen seitens des Benutzers.
ffmpeg -i in.mkv -c copy -reserve_index_space 50k out.mkv
wobei der reserve_index_space
Wert in Bytes die für den Index benötigte Größe ist. 50k
Bytes ist die empfohlene Größe für 1 Stunde Medien.
Antwort2
Aufbauend aufGyans Antwort, mkclean ist das richtige Tool, um MKVs für das Streaming zu optimieren. Mir sind jedoch einige Macken bei der Dateierstellung durch mkclean aufgefallen, also habe ich einen Fork erstellt:https://github.com/XMB5/mkclean-pragmatic
Anwendungsbeispiel:mkclean test.mkv test_streaming_optimized.mkv
Hier einige Auszüge aus der Readme-Datei:
Hintergrund (warum wir mkclean überhaupt brauchen)
Um MKV-Dateien zu streamen, muss der Videoplayer dieCues-Element, ein Teil der Datei, der Videozeitstempel Byte-Offsets zuordnet. Diese Offsets ermöglichen es dem Videoplayer, im gesamten Video nach Zeitstempeln zu suchen, ohne die Byte-Position in der Datei erraten zu müssen.
Normalerweise befindet sich das cues-Element am Ende einer Matroska-Datei (sieheMatroska-Strukturdiagramm). Dies liegt daran, dass die Anwendung, die das MKV erstellt, zuerst alle Videodaten schreibt und erst danach die genauen Byte-Positionen des Videoinhalts ermitteln kann.
Allerdings ist es nicht ideal, das Cues-Element am Ende der Datei zu haben: Der Videoplayer muss den Suchkopf am Anfang der Datei lesen, dann zum Ende der Datei suchen, um die Cues-Informationen zu lesen, und dann zurücksuchen, um den Videoinhalt zu lesen. Beim HTTP-Streaming sind das 3 separate Anfragen, die im Vergleich zu 1 Anfrage einige Sekunden Verzögerung hinzufügen.
mkclean
strukturiert eine MKV-Datei so um, dass das Cues-Element am Anfang steht und die Videowiedergabe dadurch früher beginnen kann.
Technische Änderungen in der Gabel (im Vergleich zum ursprünglichen mkclean)
- Stellen Sie die Doctype-Version
matroska v4
standardmäßig ein- Setzen Sie die Dokument-Leseversion auf 2 (aus Kompatibilitätsgründen, sonst funktioniert es nicht mit VLC, MPV, FFMPeg usw.).
- Optimierungen standardmäßig deaktivieren (entspricht dem normalen mkclean
--no-optimize
-Flag) - Ignorieren, wenn Cluster-Zeitstempel nicht in chronologischer Reihenfolge sind
- Das erzwungene Ändern der Zeitstempel führt dazu, dass mpv die Warnung „Ungültiger Video-Zeitstempel: 10.085000 -> 10.060000“ ausgibt.