Kann hier wer Perl?

  • zmi hat bei http://forum.doom9.org/showthread.php?t=112199 ja sein tc2mp4 skript gepostet, und ich würde gerne ein kleines Programm schreiben (in C++) welches Matroska Timecodes v2 und MP4 nhml Timecodes ineinander umwandeln kann. Nur versteh ich das Skript nicht um darauf zu verstehen wie das Ganze gehen könnte. :)

    Wenn mir jemand mit Pearlkenntnissen da helfen könnte wäre das super. :)
    (hab echt keinen Nerv mir noch Pearl anzueignen)

    Cu Selur

  • Ich kann zwar kein Pearl, aber genug PHP und andere Sprachen, um Ähnlichkeiten zu entdecken...

    Schwierig ist für mich nur zu wissen, in wiefern du da Hilfe brauchst, also was du im Einzelnen noch nicht verstehst.

    Ein Forum ist da der falsche Weg, das muss interaktiv passieren (z.B. über einen IRC-Channel, Private Messenger - ICQ / Skype Chat - o.ä.).

    Bis da hin... http://de.selfhtml.org/perl/index.htm

    P.S.: "Perl" ohne "a".

  • Mein Problem ist erst mal ganz einfacher Natur. :)
    Ich habe ja ein File mit einem Zeiteintrag pro Frame wie bildet sich der dazugehörige Konten im nhml Dokument?

    Wie ich das tool momentan verstehe bzgl. der Konvertierung von mkv timecodes (v2) nach mp4 timecodes.

    $tcfv <- source timecode file
    $lcmTimescale = 1000000; <- irgen dein Wert
    $cts = parseTimecodeV2($srcTC); <- vermutlich ein Array in dem für jedes Frame der entsprechende Timecode aus dem mkvTimeocode file steht. WQobei mir in der parseTimecodeV2 unklar ist warum bei int($1 * 1000 + 0.5) die '+ 0.5' gebraucht wird, da die Timecodes ja bereits Integer wären, weshalb ich vermute, dass die parseTimecodeV2 doch etwas anderes macht als ich vermute. :)
    Danach in Zeile 61 verliert er mich dann weil er jetzt von einem vorhandenen .mp4 File ausgeht welches ich nicht habe und es dann so aussieht, als ob nur die Einträge im nhml File, das er aus dem .mp4 File hat modifiziert werden.

    Cu Selur

    Ps.: momentan nur sporalisch online, werde aber auf die Chatgeschichte eventuell die Tage zurück kommen. :)

  • $srcTC könnte die gesamte Timecode-Datei sein, die bereits fertig in ein String-Array gelesen wurde.

    $lcmTimescale = 1000000 -- nicht "irgendein Wert", sondern wohl eher eine Rechenbasis auf Mikrosekunden; int($1 * 1000 + 0.5) sieht mir daher aus nach "runde auf Millisekunden".

  • hier mal ein Beispiel:

    Code
    # timecode format v204283125167209250292334375417459501542584626667709751792834876


    wobei ich mir nicht sicher bin ob sie zusammen passen:

    Das Problem ist, dass mir das nhml Format auch sehr unklar ist,... und http://gpac.sourceforge.net/doc_nhnt.php irgendwie auch nicht hilft (momentan).

  • Ich bin ziemlich fit mit Perl :D, kenne mich bei den Dateiformaten aber nicht aus.

    Ich habe den Perl-Script geholt und reingeschaut. Er ist ohne grosse Verzwickelungen, also relativ "straight forward" geschrieben.

    $srcTC = Name der Timecode File
    $tcfv = Version der Timecode File (1 oder 2)

    Die Version 1 scheint recht kompliziert zu sein- viele Hilfsprozeduren werden nur dort angewendet.

    Bei der Version 2 wird jede Zeile gelesen und nach Dezimalzahlen gesucht. Der Ausdruck in Klammern

    Code
    next unless /([\d.]+)/;


    pickt eine Menge von 1 oder mehr Ziffern und Dezimalpunkt (beliebige Reihenfolge) aus der Zeile heraus. Das Gefundene wird als $1 referenziert.
    Die erwähnte Rundung deutet darauf hin, dass die Eingangswerte Millisekunden sind (ggf. mit Dezimalteil) und ganzzahlige Mikrosekunden herauskommen sollen (siehe hierzu der Delay Ausdruck in applyTimecode und der Wert $lcmTimescale = 1000000 wie LigH schon sagte). Die Beispieldatei hat aber nur Ganzzahlen...

    @cts ist ein Array mit diesem Eintrag pro Frame. Ein Element daraus ist aber $cts[$i]

    In readTimebase liest er maximal 10 Zeilen und bestimmt die Differenz von 2 auf einander folgende DTS="nn" Werte. Als Quercheck auch den Mittelwert (letzter-erster)/Anzahl. Die Beiden Werte müssen übereinstimmen. In deinem Beispiel: 5005

    Im Unterprogramm applyTimecode wird die NHML Datei eingelesen und mit Modifikationen auf die neue Datei geschrieben. Im wesentlichen ersetzt er timeScale mit 1000000 und die DTS Werte mit den Mikrosekunden aus @cts. Weitere Umformungen haben wohl mit Variable Frame Rate tu tun. Die neue NHML Datei wird dann mit mp4box verarbeitet.

    Ich habe noch nichts mit mp4 oder mkv unternommen, kann daher nur (unfundierte) Vermutungen über die anderen Modifikationen aufstellen (das lasse ich lieber sein :nein:).

    G

  • Ich bin ziemlich fit mit Perl :D


    Ich war mal ziemlich fit in Perl. Ich hatte mal das Vergnügen, mich 4 ganze Jahre mit Perl herumzuschlagen (Entwicklung einer "LAMP-Plattform"). Ist aber schon einige Jahre her. Ich bräuchte also wieder eine Warmlaufphase. :D

Jetzt mitmachen!

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