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