Beiträge von mkver

    Eine Sache noch: ffmpeg scheint das mit der Duration eher ein bisschen lockerer zu sehen: Beispiel: Du hast einen Film, der überwiegend 25p ist, aber auch einen Teil mit 50p beinhaltet (das gibt es wirklich: haufenweise Fernsehsendungen sind 25p (enkodiert als 50p durch Framedopplung), aber die Credits laufen dann mit richtigen 50p). Die DefaultDuration sollte man dann auf 25p setzen und den 50p Teil mit BlockDurations versehen (das geht leicht mit mkvmerge und timestamp format v1). Die besagten BlockDurations gehen beim Remuxen mit ffmpeg verloren; es benutzt nur SimpleBlocks in diesem Fall. Wenn man die Spezifikationen ernst nimmt, müsste man eine Zeit lang zwei Bilder gleichzeitig anzeigen. (Die Player scheint das nicht zu stören, die tun in diesem Fall das Richtige.) Verlass dich also bloß nicht darauf, dass deine Eingangsdateien alle absolut fehlerfrei sind.

    Ältere Versionen von mkvmerge haben standardmäßig einen Suchkopf am Ende der Datei geschrieben, in dem jeder Cluster referenziert wurde. (Dieser zweite Suchkopf wurde wiederum vom ersten Suchkopf referenziert.) Aber das ist nicht mehr standardmäßig so, denn die Positionen aller Cluster bringt beim Spulen eigentlich keinen Mehrwert, man muss ja mit dem Dekodieren sowieso beim Schlüsselbild anfangen.
    Du musst nicht 10% oder so parsen; parse die Cues und gehe zum letzten Schlüsselbild. Das reicht.

    Ja, das ist so ziemlich Standard. Die einzige mir bekannte Ausnahme (wenn man davon absieht, dass z.B. mkvmerge bei entsprechenden Kommandozeilenparametern ebenfalls Dateien ohne Cues erstellen kann) ist das in viele Versionen von x264 eingebaute Matroska Ausgabemodul (das auf Haalis Muxer basiert); aber diese Dateien werden üblicherweise noch einmal remultiplext (mit Tonspuren etc. versehen).
    Beachte übrigens, dass eine GOP über mehrere Cluster verteilt sein kann; d.h. wenn du die Cues analysierst und dann zu dem Cluster mit dem letzten Schlüsselbild der Datei springst, musst du noch nicht den letzten Cluster der Datei haben.

    1. IDX/SUB haben (üblicherweise) eine wohldefinierte Länge.
    2. Bzgl. der Länge von Blöcken solltest du dir einmal die Erklärung bzgl. Blockduration ansehen. Im Wesentlichen besagt sie, dass die Dauer eines Blocks gegeben ist durch
    a) den durch BlockDuration (des Blocks) signalisierten Wert.
    b) den durch DefaultDuration signalisierten Wert (sofern vorhanden), falls nicht schon durch a) ein Wert gegeben ist.
    c) die Differenz der Zeitstempel des nächsten (Simple)Blocks in Anzeigereihenfolge und des Zeitstempels des fraglichen (Simple)Blocks (dessen Dauer man herausfinden will), falls der zu untersuchende Block nicht der letzte Block in Anzeigereihenfolge ist und falls nicht schon durch a) oder b) ein Wert gegeben ist.
    Für einen SimpleBlock kommt nur b) und c) in Frage; für den letzten Block (an dem du interessiert bist) nur a) und b).
    3. Es gibt grundsätzlich zwei Möglichkeiten, in einer Matroska-Datei zu spulen: Alle Level 1-Elemente (also die, die auf derselben Ebene wie Cluster sind) haben eine EBML ID mit einer Länge von vier Bytes; man kann die Datei danach absuchen (natürlich muss man Vorkehrungen für falsche Treffer treffen). Oder man benutzt die Cues (den Index). Sofern vorhanden kannst du hier die Position des letzten Schlüsselbildes herausfinden und dann von dort aus den Rest der Datei parsen. Die Cues selbst werden üblicherweise in einem Suchkopf ganz am Anfang referenziert.