Wie setze ich Marken an Dateigrenzen

  • Hi,
    Ich mochte an jeder Stelle wo eine 00x.vdr beginnt 2 Marken zur kennzeichnung setzen (2 statt einer damit nicht aus versehen was rausgeschnitten wird)
    Die aeusserst unelegante Variante waere fuer jedes einzelne 00x.vdr eine index.vdr mittels genindex anlegen zu lassen und anhand deren Groesse die Länge des 00x.vdr zu bestimmen.
    Gibts da was eleganteres um die Laenge eines VDR files zu berechnen ?

  • Ok, hier ein paar Insider, wie sowas gehen würde:


    Das folgede Beispiel ist eine marks.vdr, die aus 001.vdr und 002.vdr besteht, mit Schnittmarken am Anfang und Ende jedes Blocks. Einfach mit der Option "Editierte Dateien aufteilen" selbst zu erzeugen - dir geht es ja quasi um den 'umgekehrten' Weg.


    marks.vdr:
    0:00:00.01
    0:08:36.13
    0:08:36.25
    0:29:57.04


    Mit der Formel h:m:s.f -> ((h*60+m)*60+s)*25+f-1 kommt man auf die Frame-Nummern der Schnittmarken:
    0
    12912
    12924
    44928


    Multipliziert mit 8 und in Hex gewandelt, ergeben sich Offsets in die index.vdr:
    0x00000000
    0x00019380
    0x000193E0
    0x00057C00


    Pickt man sich die mittleren beiden aus der Liste heraus - der Übergang von 001.vdr zu 002.vdr, sieht die index.vdr (hexdump -C) so aus:


    00019340 8d a4 e4 0e 03 01 00 00 88 be e4 0e 03 01 00 00 |.¤ä......¾ä.....|
    00019350 ac db e4 0e 02 01 00 00 73 10 e5 0e 03 01 00 00 |¬Ûä.....s.å.....|
    00019360 df 2e e5 0e 03 01 00 00 fa 4a e5 0e 02 01 00 00 |ß.å.....úJå.....|
    00019370 99 7d e5 0e 03 01 00 00 bc 99 e5 0e 03 01 00 00 |.}å.....¼.å.....|
    00019380 68 b7 e5 0e 01 01 00 00 d5 96 e6 0e 03 01 00 00 |h·å.....Õ.æ.....|
    00019390 30 b0 e6 0e 03 01 00 00 ca c5 e6 0e 02 01 00 00 |0°æ.....ÊÅæ.....|
    000193a0 e9 f4 e6 0e 03 01 00 00 3c 0e e7 0e 03 01 00 00 |éôæ.....<.ç.....|
    000193b0 66 22 e7 0e 02 01 00 00 74 4c e7 0e 03 01 00 00 |f"ç.....tLç.....|
    000193c0 56 61 e7 0e 03 01 00 00 f0 76 e7 0e 02 01 00 00 |Vaç..... vç.....|
    000193d0 37 a6 e7 0e 03 01 00 00 1a be e7 0e 03 01 00 00 |7¦ç......¾ç.....|
    000193e0 00 00 00 00 01 02 00 00 6e 5c 01 00 03 02 00 00 |........n\......|
    000193f0 5c 90 01 00 03 02 00 00 6b c4 01 00 02 02 00 00 |\.......kÄ......|
    00019400 9e 17 02 00 03 02 00 00 0b 45 02 00 03 02 00 00 |.........E......|


    Je 8 Bytes beschreiben einen Frame. Die ersten 4 Bytes sind der Byte-Index in die xxx.vdr, Byte 5 unterscheidet I- P- und B-Frames, Byte 6 ist die Nummer der xxx.vdr-Datei. Die letzten 2 Byte sind immer 0.


    Der Cut-In Datensatz ist der erste, bei dem im 6. Byte die 02 steht - der Hinweis, dass der Frame in der 002.vdr ist. Außerdem ist der Offset - die ersten 4 Bytes - null.


    Der Cut-Out ist schwieriger zu finden: Von allen Datensätzen, die noch eine 01 im 6. Byte haben, bestimmt man den letzten, der eine 01 im 5. Byte hat, und damit ein I-Frame ist.


    Die Strategie ist damit klar: Durchlaufe die index.vdr in 8-Byte-Blöcken, und merke dir den ersten und letzten I-Frame (Byte 5 = 01) jeder xxx.vdr (Byte 6). Rechne den Offset dann wieder in h:m:s.f um und schreibe ihn in eine marks.vdr.


    Viel spass!



    Gruß,


    Udo

  • Hi,


    Danke :)
    So klappts in Bash:


  • Kreativ, aber falsch.


    Zunächst mal, hexdump gibt 16 Bytes pro Zeile aus, du musst also auch den Fall behandeln, dass der gesuchte Frame in den hinteren 8 Byte liegt. Außerdem bestimmst du nur die Gesamtzahl der Frames, nicht aber die Nummer des letzten I-Frame. Schnittmarken verweisen immer nur auf I-Frames.


    hexdump kennt spezielle Formatoptionen. Schau mal durch, ich denke, du kannst hexdump auch zu 8 Byte pro Zeile überreden.


    Außerdem musst du mit grep die erste Zeile mit "0[0-3] $xnum" und die letzte Zeile mit "01 $xnum" heraus finden. Aber auch das sollte möglich sein.


    Gruß,


    Udo

  • Zitat

    Kreativ, aber falsch.


    Falsch ist da gar nichts denn es erfuellt genau das was ich vorhatte, und hat mich ca 10 Minuten gekostet ;)
    Dass das Ergebnis nicht exakt ist weiss ich natuerlich, aber es ist voellig ausreichend.
    Ob die Marke nun ein paar Zehntelsekunden falsch ist, interessiert mich nicht, ich habe oefters mal ruckeln beim Abspielen und wollte ne Moeglichkeit habe zu ueberpruefen ob das an Dateigrenzen liegt, geschnitten wird da eh nichts :)

  • Hi,


    Danke Udo fuer die Tipps !!!
    Nun hab ich es doch korrekt gebraucht und dabei kommt dieses Script raus:


  • Der Unterschied ist, dass früher fest von einer Framerate von 25fps ausgegangen wurde, diese bei TS und HD aber nicht mehr fix ist. Außerdem hat sich das Format der index-Datei etwas geändert.


    In der info-Datei findet sich eine Zeile "F 25" oder "F 50", Kommawerte sind auch möglich. Mark-Positionen sind weiterhin hh:mm:ss:ff, nur kann ff jetzt halt größer als 24 werden. Die diversen Divisionen durch 25 müssen jetzt durch die korrekte Framerate teilen, wobei die Bash glaube ich nicht mit Kommazahlen rechnen kann.


    Die index-Datei hat auch ihr Format geändert, der Übergang von Datei 1 zu 2 sieht jetzt so aus:


    78 1b 35 02 00 00 01 00
    00 00 00 00 00 80 02 00


    Die ersten 5 Bytes sind der Byte-Offset in der Datei, die 80 markiert einen I-Frame, und die letzten zwei Byte sind die Dateinummer.


    Gruß,


    Udo

Jetzt mitmachen!

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