Matroska parsen

  • Also alle Blöcke haben in der Datei 40ms BlockDuration, aber DefaultDuration ist 20ms? Dann ist wohl eins von beiden falsch. Bzw. wenn alle Blöcke ein Duration-Element haben, wird DefaultDuration halt eh nicht benutzt.


    Kannst Du die Datei hochladen?

  • Also alle Blöcke haben in der Datei 40ms BlockDuration, aber DefaultDuration ist 20ms? Dann ist wohl eins von beiden falsch. Bzw. wenn alle Blöcke ein Duration-Element haben, wird DefaultDuration halt eh nicht benutzt.


    Kannst Du die Datei hochladen?


    Hier ein Stück der Datei.


    Klar kann eines der beiden Werte falsch sein, aber ich gehe immer als erstes davon aus das Mosu dort alles richtig hat.


    Ich brauche die DefaultDurartion, da ich noch andere Möglichkeiten nutzen möchte um an die Video-Spieldauer(Zeiten) heranzukommen.
    Hierzu möchte mit den Statistic Tags und den dort befindlichen NUMBER_OF_FRAMES Eintrag die Spieldauer errechnen.
    Klar dort gibt es auch eine direkte DURATION für das Video, aber eben auch nur wieder auf Millisekunden genau.



    Mein Parser funktioniert soweit, leider gibt es da ein "Problem" das beim ersten mal, wenn eine Datei geparst wird, es mehr als 20Sekunden dauern kann.
    Lädt man die Datei ein zweites mal geht das parsen innerhalb von 50ms. Das hat was mit dem Cachen der Datein zu tun, Windows/Festplatten abhängig. Aufjedenfall stört mich das bissl, daher versuche ich mehrere Parser-Optionen einzubauen.

  • Hier ein Stück der Datei.


    Klar kann eines der beiden Werte falsch sein, aber ich gehe immer als erstes davon aus das Mosu dort alles richtig hat.


    Für mich das "falsch". Also nicht strikt falsch, weil DefaultDuration halt überflüssig ist, aber ich hätte DefaultDuration auf 40ms gesetzt.
    Wie hast Du die Datei denn erstellt? Direkt aus einer VOB mit mkvmerge? Vielleicht hat mkvmerge nur die Werte falsch von einem anderen mkv-Muxer kopiert.


    Ich brauche die DefaultDurartion, da ich noch andere Möglichkeiten nutzen möchte um an die Video-Spieldauer(Zeiten) heranzukommen.
    Hierzu möchte mit den Statistic Tags und den dort befindlichen NUMBER_OF_FRAMES Eintrag die Spieldauer errechnen.


    MKV ist VFR. Funktioniert nicht.


    Klar dort gibt es auch eine direkte DURATION für das Video, aber eben auch nur wieder auf Millisekunden genau.


    Dann ist das halt so. Damit mußt Du leben.
    Von dieser Idee, daß Du alles auf ns genau ermitteln könntest, solltest Du Dich verabschieden. Oder auch von der Idee, daß mkvmerge oder andere Muxer korrekt arbeiten. Und was die Player aus dem ganzen am Ende machen, ist wieder eine andere Sache.

  • Für mich das "falsch". Also nicht strikt falsch, weil DefaultDuration halt überflüssig ist, aber ich hätte DefaultDuration auf 40ms gesetzt.
    Wie hast Du die Datei denn erstellt? Direkt aus einer VOB mit mkvmerge? Vielleicht hat mkvmerge nur die Werte falsch von einem anderen mkv-Muxer kopiert.


    Die 1.Datei stammt direkt von den Vobs welche vorher mit PgcDemux extrahiert wurden, dann habe ich wieder mit MTX und split-code dieses kurze mkv erstellt. Im 1. mkv ist es mit den Zeiten ebenso.



    MKV ist VFR. Funktioniert nicht.


    OK, aber für Bluray und DVD Material scheint es zu klappen, denn da gibt es keine VFR, oder?




    Dann ist das halt so. Damit mußt Du leben.
    Von dieser Idee, daß Du alles auf ns genau ermitteln könntest, solltest Du Dich verabschieden. Oder auch von der Idee, daß mkvmerge oder andere Muxer korrekt arbeiten. Und was die Player aus dem ganzen am Ende machen, ist wieder eine andere Sache.


    Ja, du magst sicher recht haben, und ich müsste mir nicht so ein Stress machen.
    Aber Mosu sagte mir das die Anzeigen/Speicherung in Matroska an einigen Stellen auf Millisekunden begrenzt ist.
    Weiterhin sagte er, wenn ich Nanosekunden haben möchte, müsste ich mir das selber aussrechnen, denn mkvmerge tut dies auch(Mosu's Worte). Nur gespeichert wird halt in ms.

  • OK, aber für Bluray und DVD Material scheint es zu klappen, denn da gibt es keine VFR, oder?


    Durch Soft-Pulldown könnte man trotzdem zu VFR kommen.


    Aber Mosu sagte mir das die Anzeigen/Speicherung in Matroska an einigen Stellen auf Millisekunden begrenzt ist.
    Weiterhin sagte er, wenn ich Nanosekunden haben möchte, müsste ich mir das selber aussrechnen, denn mkvmerge tut dies auch(Mosu's Worte). Nur gespeichert wird halt in ms.


    Ja, aber mkvmerge nimmt sicher nicht ms aus einer mkv-Quelle und macht daraus ns. Sondern z.B. --default-duration 0:24000/1001fps wird intern in ns gerechnet und dann beim Abspeichern der Elemente auf ms gerundet.

  • Durch Soft-Pulldown könnte man trotzdem zu VFR kommen.


    Gut, dann werde ich diese Option der Berechnung nicht einbauen. Danke für dir Klärung.




    Ja, aber mkvmerge nimmt sicher nicht ms aus einer mkv-Quelle und macht daraus ns. Sondern z.B. --default-duration 0:24000/1001fps wird intern in ns gerechnet und dann beim Abspeichern der Elemente auf ms gerundet.


    Ja, da hast du auch wieder Recht. Reverse Engineering an einem mkv scheint dann wohl wirklich nicht immer zu klappen, oder es ist einfach zu aufwendig.


    Ich denke für das Matroska-Linking reichen die ms aus.


    Wobei es für das Schneiden immer wichtig ist mit ns-Genauigkeit zu arbeiten. mkvmerge schneidet dann wirklich an den "schnittstellen" (wenn Key-frame vorhanden usw.).

  • Code
    1. # Version 19.0.0 "Brave Captain" 2017-12-17
    2. ## New features and enhancements
    3. * mkvmerge: splitting by duration, by timestamps or by timestamp-based parts:
    4. mkvmerge will now consider the first key frame within 1ms of the requested
    5. value to be eligible for splitting.


    Davon abgesehen: wenn mkvmerge eh nur mit 1ms speichert, reicht doch auch 1ms Genauigkeit fürs Splitten. Sehe das Problem nicht.

  • Ich habe mit MTX19 noch noch wirklich das Schneiden für eine Bluray oder DVD gemacht und genau betrachtet.


    Ich kann dir nur kurz erklären wie es im alten cE war. Dort habe ich anfangs mit DGIndexNV alle Schnitt-ZeitStempel aus einer .dgi-Datei erstellt mit Millisekunden genauigkeit.


    Dann beim Schneiden fehlten ein bis zwei Bilder oder waren zu viel.
    Dann habe ich die Genauigekit auf ns beim berechnen erhöht und MTX lieferte mir nun genaue Schnitt-Ergebnisse.
    Warum und wieso weis ich nicht, das wird sicher mit mkvmerge und den internen Zeiten zu tun haben, da die ja mit ns laufen.


    Diese neue Anpassung ist bestimmt gut, denke mal nun reicht ms-Genauigkeit aus um dennoch am richtigen Keyframe zu schneiden.

  • BlockDuration geht vor. Wenn die immer da ist, wird DefaultDuration ignoriert.


    In einer Blockgruppe gibt es die BlockDuration und ja nur einen Block, welcher wie der SimpleBlock eine "relative" Zeit beinhalten.


    BlockDuration = Block-relativZeit
    Sind die Zeiten immer gleich? (Sollten sie oder?)


    Welche Zeit hat Vorrang?


    EDIT:
    Ich glaube ich verwechsel da was oder?

  • Soweit ich verstanden habe, ist doch die BlockDuration das, was variable Frame-Rate ermöglicht?


    Wenn also die BlockDuration verwendet wird, dann auch für jeden Block, und dann muss man pessimistisch davon ausgehen, dass eventuell VFR vorliegen könnte, also nicht jedes Frame gleich lange dargestellt wird (auch wenn sich dann am Ende u.U. herausstellt, dass doch alle gleich lang waren). Oder?

  • 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.

  • Recht vielen Dank für den Hinweis.


    Ich hatte in Mosu thread bereits so eine mkv Datei als Sample bereitgestellt.


    Wie gesagt DVD 25FPS MPEG2, aber irgendwie wird dort auch ein Interlaced Flag gesetzt.
    Auf der Verpackung steht aber was FullFrame, da dachte ich das ist ganz normales Progressives Material.


    Könnte ich beim muxen des mkv's die DefaultDuration als Parameter setzen, und dennoch geht beim muxen alles glatt?

  • (das geht leicht mit mkvmerge und timestamp format v1).


    Da kenne ich mich noch zu wenig aus. Hatte das aber immer beim DVDMenuXtractor gesehen. Scheint auf jedenfall ein gutes Hilfsmittel zu sein.



    Verlass dich also bloß nicht darauf, dass deine Eingangsdateien alle absolut fehlerfrei sind.


    Ja und nein. Im Prinzip ist es nicht so wichtig, da diese ganze Prozedur nur der Ermittlung der Videozeiten dient.


    Diese Videozeiten sind lediglich eine neue Art, besser mit Matroska-Linking zu arbeiten. Im alten cE nutzte ich nur die "ordered chapters" als Input, und dort sind die Zeiten so wie sie sind.


    Nach dem Matroska Treffen in Wien meldete sich ein Mitarbeiter aus der Dresdner SLUB und wollte so ein "einfaches Linking" haben.
    Ich hatte ihm dann etwas geholfen und er hat ein Bash Script für Linux geschrieben.


    Allerdings sagte ich ihm auch das die Datei "Duration" nicht immer die richtige Zeit ist.
    Das wollte ich gerne in meinem cE besser haben/machen.


    Das ganze hat jetzt auch einiges an Zeit in Anspruch genommen, aber so habe ich wenigstens weiteren Einblick in die Matroska-Welt bekommen und komme meinem eigentlichen Ziel, dem Matroska Menü, etwas näher.