• Naja, da müßte man zuerst mal eine Definition dessen haben, was genau "die Spieldauer" eigentlich sein soll.


    Als Spieldauer meine ich die Dauer welche das Video im Player abgespielt/angezeigt wird.

    Im Anhang ist mal eine Beispiel mkv Datei.
    Mkvmerge Identify und auch MediaInfo zeigen eine Spieldauer von 576ms. MediaInfo zeigt aber bei der Videospur 560ms, aber für die Audios 576ms, daher meine Vermutung das in der SegmentInfo eben der größte Wert steht.

    Da ich gerade dabei bin im cE den Matroska Menü-Editor neu zumachen, muss ich nun eine bessere Lösung finden als die "Info-Spieldauer", da diese einfach NIE korrekt ist.

    In einem meiner Test wird ganz deutlich das diese Spieldauer-Angabe falsch/ungenau ist.
    Ich habe dazu ein Film mit MTX in Teile geschnitten, diese dann mittels Matroska Hard-Linking verbunden. Spieldauer 2min58sek = Korrekt
    Wenn ich das ganze mittels Medium-Linking mache(Spieldauer der Datei wird dazu benutzt) erhalte ich eine Spieldauer von 3min07sek

    Im Player bleibt das Bild jedesmal für 1 bis 2 Sekunden hängen, bis ein neuer Schnitt-Teil erreicht ist.



    Mit "fps" ist schlecht, denn Matroska ist bekanntlich variabel.


    Ok, verstehe. Es gibt also kein Element wo man diesen Wert diekt auslesen kann.

    Anfang des ersten Blocks bis letzter Block (+Default Duration o.ä.) hört sich vernünftig an


    Erster bis letzter Block?? Verstehe das nicht genau wie du es meinst.



    , aber dann ist die Frage, welche Tracks man sich anschauen möchte, denn das ist ja für jeden anders.


    Ich denke der Video Track ist der entscheidente.


    Mkvmerge taggt da auch jeden Track einzeln mit dieser Info. Also statt "Definition" vielleicht noch eher die Frage nach dem Zweck... Ich wüßte nicht, warum da MediaInfo oder irgendein Player das Maß der Dinge sein sollten.

    Die Statistic Tags sind nicht immer vorhanden, also kein zuverlässiges Mittel, außerdem ist da auch keine gute Info für mich enthalten.

  • Als Spieldauer meine ich die Dauer welche das Video im Player abgespielt/angezeigt wird.


    Wofür ist das relevant?

    Die Videospur in der Datei ist laut Container 480ms lang. Erster Frame startet bei 0s, letzter Frame startet bei 440ms (für Dauer von 40ms). Aber wie hilft Dir das weiter? (Abgesehen davon, daß ich nicht weiß, ob der MPEG2-Bitstream in der Form brauchbar ist. Würde zum Testen lieber etwas sauberes codieren, am besten ohne B-Frames...)
    Ich kenne Deinen Player nicht und halte es für gefährlich, sich an einem bestimmten zu orientieren. Was willst Du machen, wenn eine Videospur nicht bei 0s startet?

    Wenn ich das ganze mittels Medium-Linking mache(Spieldauer der Datei wird dazu benutzt) erhalte ich eine Spieldauer von 3min07sek


    Was heißt "Spieldauer der Datei wird dazu benutzt"?

  • Wofür ist das relevant?...
    ...Was heißt "Spieldauer der Datei wird dazu benutzt"?


    Für das Matroska Medium-Linking. Dort wird einfach ein ordered Chapter verwendet mit Startzeit 0 und Endzeit="Spieldauer" und der entsprechenden SegmentUID zur Datei.


    Die Videospur in der Datei ist laut Container 480ms lang. Erster Frame startet bei 0s, letzter Frame startet bei 440ms (für Dauer von 40ms).


    Interessant: hast du all diese infos NUR durch parsen der mkv Datei erhalten oder was für Tools hast du zum analysieren verwendet?



    Aber wie hilft Dir das weiter? (Abgesehen davon, daß ich nicht weiß, ob der MPEG2-Bitstream in der Form brauchbar ist. Würde zum Testen lieber etwas sauberes codieren, am besten ohne B-Frames...)
    Ich kenne Deinen Player nicht und halte es für gefährlich, sich an einem bestimmten zu orientieren. Was willst Du machen, wenn eine Videospur nicht bei 0s startet?

    Wie das Video in der "Haupt-Datei" aufgebaut ist, soll/darf/brauch nicht wichtig sein für das abspielen. Nur die Infos für den Splitter: Anzahl Streams, Codecs usw werden ausgelesen, denn diese Hauptdatei wird NICHT in der neuen Virtuellen Timeline verwendet.

  • Mediainfo oder sonst ein Infoprogramm parst nicht das Video, das würde viel zu lange dauern. Die gucken im Header und das wars. FFprobe bzw. MkvInfo können das Video parsen und anhand der Framelänge und -anzahl feststellen, wie lang es tatsächlich ist. Dazu müssen auch B-Frames berücksichtigt werden, weil die ja auch gezeigt werden. Ob die GOP-Länge irgendwo vermerkt ist, kann ich grad nicht prüfen, bezweifele das aber. Die müßte man anhand der enthaltenen B-Frames vermutlich erst mal bestimmen. Für die Berechnung der Videolänge über die Frames ist es egal, ob es bei „0“ oder sonstwo losgeht, da geht es nur um die Tracksychonizität.

  • Interessant: hast du all diese infos NUR durch parsen der mkv Datei erhalten oder was für Tools hast du zum analysieren verwendet?


    Nur aus mkvinfo ausgelesen.
    mkvinfo_dauer_-or82.png

    Für die Berechnung der Videolänge über die Frames ist es egal, ob es bei „0“ oder sonstwo losgeht, da geht es nur um die Tracksychonizität.


    Er will ja in eine neue Timeline mappen (quasi von "physisch" zu "virtuell"). Wenn "physisch" bei +500ms losgeht, müßte er das auch in der Chapter-XML berücksichtigen.

  • Ich hatte die Datei auch mit MKVInfo angeschaut, aber nicht gleich durchgesehen.

    Nach ein bissl Specs-Analyse verstehe ich das etwas besser.
    Bin aber auch verwundert das die Blockgruppe nicht nach "Startzeiten" sortiert sind. Dafür steht dann dort immer noch etwas von einem Referenzblock mit einer Zeitangabe, immer zwei Angaben einmal positive Zeit und einmal negativ. Mir noch nicht ganz klar....

    Ich müsste also den Cluster finden, wo in der Blockgruppe ein Block ist, mit dem "höchsten" Zeit wert und dann dessen Blockdauer addieren.

    Was ist mit den Simpleblocks, da steht nicht viel Info drin, diese sind dann auch nicht so wichtig??

  • Bin aber auch verwundert das die Blockgruppe nicht nach "Startzeiten" sortiert sind.


    Coding Order vs Display Order. Die sind bei Dateien mit B-Frames i.d.R. nicht identisch.

    Dafür steht dann dort immer noch etwas von einem Referenzblock mit einer Zeitangabe, immer zwei Angaben einmal positive Zeit und einmal negativ. Mir noch nicht ganz klar....


    Referenzen von P- und B-Frames.

    Ich müsste also den Cluster finden, wo in der Blockgruppe ein Block ist, mit dem "höchsten" Zeit wert und dann dessen Blockdauer addieren.


    Ja, so denke ich mir das.

    Was ist mit den Simpleblocks, da steht nicht viel Info drin, diese sind dann auch nicht so wichtig??


    Auch Simpleblocks können Videoframes enthalten. Ist nur bei dieser Datei nicht so.
    Wenn keine Blockdauer explizit drinsteht mit DefaultDuration.

  • Coding Order vs Display Order. Die sind bei Dateien mit B-Frames i.d.R. nicht identisch.


    OK, ich weis da bissl aber sicher noch nicht genug.
    Display Order hat dann geordente Zeitstempel und Coding Order nicht?


    Referenzen von P- und B-Frames.


    Das Element "ReferenceBlock" hat als Werte-Bereich "i" Signed Integer, was Nanosekunden sind. Es steht dort ja auch nur ein Zeitstempel, aber woher weis man dann ob es P oder B frames sind?



    Ja, so denke ich mir das.


    Kann ich aber davon ausgehen das die Cluster in Zeitreihenfolge geordnet sind, dann müsste man nur im letzten Cluster suchen.


    Auch Simpleblocks können Videoframes enthalten. Ist nur bei dieser Datei nicht so.
    Wenn keine Blockdauer explizit drinsteht mit DefaultDuration.


    Wo finde ich dann die Dauer für den SimpleBlock. Einen "Start" Zeitstempel sehe ich, und die Anzahl der Bilder.

    Den Wert "DefaultDuration" verstehe ich noch nicht ganz. Wo finde ich diesen Default Wert?

  • Display Order hat dann geordente Zeitstempel und Coding Order nicht?


    Ja. Coding Order ist halt, wie es gespeichert ist. Und Display Order, wie wir Menschen uns das anschauen. Ist jetzt auch nicht wirklich relevant, außer halt überhaupt zu wissen, daß der letzte Block (von der Reihenfolge, wie er gespeichert ist, nicht unbedingt den letzten Frame (von der Anzeigezeit) enthält.

    Das Element "ReferenceBlock" hat als Werte-Bereich "i" Signed Integer, was Nanosekunden sind. Es steht dort ja auch nur ein Zeitstempel, aber woher weis man dann ob es P oder B frames sind?


    Wenn da eine positive Referenz ist, muß es ein B-Frame sein. Ist aber nicht wichtig zu wissen.

    Kann ich aber davon ausgehen das die Cluster in Zeitreihenfolge geordnet sind, dann müsste man nur im letzten Cluster suchen.


    Ja. (Sind sind aber nicht, also egal...)

    Wo finde ich dann die Dauer für den SimpleBlock. Einen "Start" Zeitstempel sehe ich, und die Anzahl der Bilder.

    Den Wert "DefaultDuration" verstehe ich noch nicht ganz. Wo finde ich diesen Default Wert?


    https://www.matroska.org/technical/spec…DefaultDuration

  • Ja. Coding Order ist halt, wie es gespeichert ist. Und Display Order, wie wir Menschen uns das anschauen. Ist jetzt auch nicht wirklich relevant, außer halt überhaupt zu wissen, daß der letzte Block (von der Reihenfolge, wie er gespeichert ist, nicht unbedingt den letzten Frame (von der Anzeigezeit) enthält.

    So in etwa hatte ich mir das im Kopf schonmal zusammengereimt. Jetzt weis ich es genau, danke schön.



    Wenn da eine positive Referenz ist, muß es ein B-Frame sein. Ist aber nicht wichtig zu wissen.


    Ja, gut zu wissen. Für die jetzige Aufgabe ist es nicht wichtig, stimmt.



    Ja. (Sind sind aber nicht, also egal...)

    Also ja, aber doch irgendwe nein??


    OK, wo es in den Specs steht ist klar, im Track, aber auch dieses Element ist nicht "zwingend", was wenn es fehlt.
    Einen Default wert gibt es nicht.

  • Ich weis, aber er ist momentan mehr als beschäftigt, und ich hatte ihn wegen dieses Themas schon des öfteren gefragt. Ich würde ihn ungern weiter nerven wollen. :)

    Die Tipps von Sneaker sind sehr gut und helfen mir weiter in die Matroska Materie einzutauchen.

  • Also ja, aber doch irgendwe nein??


    Ah, sorry, war wohl mißverständlich. Wollte sagen: wenn es so wäre, dann müßte man nur im letzten Cluster suchen. Da dem aber nicht so ist: nur im letzten Cluster zu suchen, ist nicht 100% sicher. (Bzw. die Cluster-Timecodes selbst könnten zwar geordnet sein, aber die Block-Timecodes sind ja beliebig versetzbar mit ihrem Offset, d.h. auch in "Bereiche" anderer Cluster hinein oder gar hinaus.)

    Die Frage wäre jetzt, was die beste Strategie ist, den letzten Zeitstempel bzw. den letzten Start-Zeitstempel zu finden. Das weiß ich so nicht. Ich würde vermutlich zum letzten Cluster gehen und dann rückwärts die Cluster durchsuchen und da irgendwo bei 30 Frames oder so einfach aufhören. Das sollte dann für 99,99% aller Dateien in der Praxis reichen. Vielleicht fragst Du für sowas besser im englischen Forum.

    OK, wo es in den Specs steht ist klar, im Track, aber auch dieses Element ist nicht "zwingend", was wenn es fehlt.
    Einen Default wert gibt es nicht.


    Ja, das ist nicht wirklich definiert, glaube ich. Ich würde da vermutlich den Unterschied zwischen letztem und vorletztem Frame nehmen, oder 0.

    3 Mal editiert, zuletzt von sneaker2 (31. Dezember 2017 um 00:40)

  • Ah, sorry, war wohl mißverständlich. Wollte sagen: wenn es so wäre, dann müßte man nur im letzten Cluster suchen. Da dem aber nicht so ist: nur im letzten Cluster zu suchen, ist nicht 100% sicher. (Bzw. die Cluster-Timecodes selbst könnten zwar geordnet sein, aber die Block-Timecodes sind ja beliebig versetzbar mit ihrem Offset, d.h. auch in "Bereiche" anderer Cluster hinein oder gar hinaus.)

    Ich habe meine TNG test folgen, dort gibt es am Ende 2 Sekunden stille Audio Daten. Die mpls Spieldauer ist 00:45:10:00.00.
    Aber im mkv wird in der SegmentInfo Duration 00:45:12:00.000 angezeigt.
    Da ich zu fast 100% ordered chapters nutze, ist die Spieldauer des mkv's dann auch nur die 00:45:10:00.00.

    Auf jedenfall gibt es einige Clusters am Ende die sich auf die Spurnummer 2 beziehen, also die Audiospur.



    Die Frage wäre jetzt, was die beste Strategie ist, den letzten Zeitstempel bzw. den letzten Start-Zeitstempel zu finden. Das weiß ich so nicht. Ich würde vermutlich zum letzten Cluster gehen und dann rückwärts die Cluster durchsuchen und da irgendwo bei 30 Frames oder so einfach aufhören. Das sollte dann für 99,99% aller Dateien in der Praxis reichen. Vielleicht fragst Du für sowas besser im englischen Forum.

    Man müsste schon ein paar einträge zurückgehen um ganz sicher zu sein.
    Allerdings weis ich jetzt(noch) nicht gleich wie man in der Matroska struktur rückwärts parst, man kennt ja die vorherige Cluster größe nicht. Manchmal gibt es einen SeekHead mit Seek Einträgen zu den Clustern, aber eben nur manchmal.

    Ich denke das es nicht sehr viel Zeit in Anspruch nimmt, durch die Cluster hindurch zu parsen.
    Als erstes muss man aber schauen welche Spuren vorhanden sind und welchen Index(Spurnummer) diese haben. Kann ja sein einer mag es das Video als letzte Spur zu haben...oder so.

    Dann die Clusters absuchen, schauen ob die Spurnummer enthalten ist. "Blöcke" durchsuchen nach der Starzeit...usw
    Hört sich eigentlich nicht schwer an.

    Ich weis das sich wahrscheinlich im englishen forum mehr Leute melden würden, aber hier ist es für mich einfacher und du scheinst dich ja auch sehr gut auszukennen.


    Ja, das ist nicht wirklich definiert, glaube ich. Ich würde da vermutlich den Unterschied zwischen letztem und vorletztem Frame nehmen, oder 0.

    Mmh, nicht so sicherere Sachen sind doof :-), da werde ich im Notfall Mosu fragen müssen.

  • Mediainfo oder sonst ein Infoprogramm parst nicht das Video, das würde viel zu lange dauern. Die gucken im Header und das wars.


    Ja da hast du recht. Ich hatte Jerome (von MediaInfo) angeschrieben. Er sagte mir das MEdiaInfo auch nur die SegmentInfo parst und wenn vorhanden: die Statistis Tags ausliest. Mehr nicht, also auch keine exakte angabe der Video-Spieldauer.

  • Ich verstehe das nicht. Ich hätte gedacht:
    1 = ElementID ( [A3] )
    (1-8) = Tracknummer
    4 = timecode
    ...

    Aber: Timecode soll ja signed int16 sein und 16 Bit sind in meiner Welt 2 Bytes, nicht 4 Bytes.

    Oder 4 = timecode + Flags, aber das wären auch nur 2 Bytes + 1 Byte...

    Oder doch wieder variable Länge? Ich suche gerade und finde nur widersprüchliche Informationen.

    2 Mal editiert, zuletzt von sneaker2 (31. Dezember 2017 um 18:14)

  • Ich hätte gedacht:
    1 = ElementID ( [A3] )
    (1-8) = Tracknummer
    4 = timecode
    ...

    Aber: Timecode soll ja signed int16 sein und 16 Bit sind in meiner Welt 2 Bytes, nicht 4 Bytes.

    Oder 4 = timecode + Flags, aber das wären auch nur 2 Bytes + 1 Byte...

    Oder doch wieder variable Länge? Ich suche gerade und finde nur widersprüchliche Informationen.

    Nummer 1 ist nicht die ElementID! Block Structure ist ein binary in der entsprechnden spezifikation.

    Bei dem Timecode(jetzt nach neuer Matroska Timestamp) habe ich auch etwas rumprobiert

    BlockGruppe Structur aus der test mkv, letzte Blockgruppe an 85221

    Code
    A0 52 FF [COLOR='#00FF00']A1[/COLOR] [COLOR='#DAA520']52 F3[/COLOR] [COLOR='#0000FF']81[/COLOR] [COLOR='#EE82EE']01 90 00 00[/COLOR] 00 01 00 02 9F FF FB B8 00 00 01 B5 84

    Block
    Block ElementGröße:
    Spurnummer in EBML form. also Byte auslesen, führende "0"en zählen usw
    Zeitstempel
    1. und 2. Byte Zeit in Milisekunden wären dann 400, so steht es auch in mkvInfo.

    EDIT:
    Diese 2 Byte reichen aus da es nur eine relative angabe ist.
    Wenn man die Cluster Zeit addiert erhält man den Zeitstempel.

    Auf jedenfall eine Sektion die noch dringen Beschreibungsbedarf hat.


    EDIT2:

    Merke aber eben das nach diesem Schema das erste Byte (erste 1) nicht berücksichtigt wird.
    Wenn ich mir aber das für andere Blocks im HexEditor anschaue dann stimmt mein Schema.

    Sehr komisch. Ich habe auch wieder Jerome angeschrieben, er kennt sich mit dem parsen auch gut aus, zumindestens hatte ich den Eindruck in Wien als er MediaConch vorgestellt hatte.

  • Wenn, dann so:

    Code
    A0 52 FF [COLOR='#00FF00']A1[/COLOR] [COLOR='#DAA520']52 F3[/COLOR] [COLOR='#0000FF']81[/COLOR] [COLOR='#EE82EE']01 90[/COLOR] [COLOR='#CC0000']00[/COLOR] 00 00 01 00 02 9F FF FB B8 00 00 01 B5 84

    Block
    Block ElementGröße:
    Spurnummer in EBML form. also Byte auslesen, führende "0"en zählen usw
    Zeitstempel
    Flags

    Und das stimmt so auch, denke ich. Wie genau dieses "Size = 1 + (1-8) + 4 + (4 + (4)) octets. So from 6 to 21 octets" zustande kommt, weiß ich nicht, aber egal.
    ElementID: 1
    Größe: 1 (min)
    Spurnummer: 1 (min)
    Zeitstempel: 2
    Flags: 1
    (Lacing: min. 0)

    Das wären dann 6. Oder er zählt statt ElementID den eigentlichen Inhalt mit. Denn ein Block ist ja nicht leer sondern enthält die eigentlichen Bild-/Ton-/Untertiteldaten mit min. 1 Byte. Letztendlich ist es egal, es muß so sein.

  • Erstmal vielen Dank für deine Hilfe, hat mir wieder sehr weitergeholfen.

    Denke auch das, dass so stimmt wie wir das ermittelt haben. Notfalls muss ich Mosu noch fragen.

    Bleibt jetzt nur noch zu klären ob "DefaultDuration" und/oder "Blockduration" immer irgendiwe vorhanden sind, denn es sind beides keine "zwingenden" Elemente.
    Ich kann mir vorstellen das für Video und Audio da werte enthalten sind, aber für die Subs wird das nicht wirklich gebraucht, daher nicht "zwingend".

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!