Wunder schönen guten Abend wünsche ich! Verzeih die späte Antwort, bewegte Arbeitswoche, hab das Wochenende hauptsächlich gelegen :o)
freezer hat geschrieben: Do 06 Aug, 2026 20:07
Ich habe diese nun ausformuliert und im BMD Thread ergänzt. Schau mal drüber ob ich eh nix vermurkst habe.
Erstmal
Danke für die Mühe. Das liest sich alles super, und schön zu sehen, dass Du auch schon mal einen PlaceCut gebraucht hättest, haha :)
Einzige Kleinigkeit: beim Bug und dem ersten wird
GetSource%Time() nicht weiter erwähnt, da das heute schon ein extrem robustes Workaround ist (gerade beim Bug auch nicht unwichtig, falls da Leute mitlesen, die die Info nicht haben). Es ist mehr lästig, dass
GetSource%Frame() nicht sauber funktioniert, zumindest wenn man es nicht weiß. Dann sieht man die Fehler erst spät, oder gar nicht.
War mir noch eingefallen: GetSource%Frame() gibt meistens korrekte Ergebnisse, Retimes sind eben tückisch (auch lineare, nicht nur Bounces), aber bei mixed-FPS tritt es auch auf.
___________________
Wo wir gerade (mal wieder, haha) über die API plaudern, und wir es ja auch mal von Schnittlisten hatte, frag mal ganz naiv gerade raus: hast Du Dich schon mal mehr mit dem Parsen von Schnittlisten beschäftigt, was die "Frame at Timeline Time" Geschichte betrifft? Für unsere Systeme wäre das vollendet-veredelte Schnittlisten-Parsing, auch außerhalb von Resolve, eine immense Arbeitserleichterung.
Bisher haben wir hauptsächlich OTIOs, DRTs, und (FCP7) XMLs untersucht. Letztere speichert In/Out und Timing-Keyframes sehr gut, aber zB keine Tangenten für non-lineare Retimes. OTIOs sind unsagbar spannend, da die ziemlich detaillierte Keyframe-Tabellen mit Tangentenbeschreibung anlegen; aber den internen Offset speichert Resolve dort Im <DynamicZoom> Key, was etwas absurd ist, aber zuverlässig. Das Problem dabei ist, dass dieser Offset integer ist, und ein Retime ist eben nicht immer integer, und dadurch entstehen Offsets (im Grunde das Problem GetSource%Time() vs GetSource%Frame(); für die Berechnung braucht man einfach den Source Float wert, gerundet wird erst am Ende).
Wenn man eine DRT umbenennt, entpackt, und sich dann die dort internen XMLs anschaut, darf man erstmal vieles decoden; danach stellt man aber fest, dass die viel mehr speichert (auch Auflösung usw, was super praktisch sein kann). Jedenfalls haben wir dann heraus gefunden, dass dieser Offset (den die OTIO in DynamicZoom speichert), dort 1. float ist und 2. auch mit <in> viel sinnvoller benannt ist. Dann fällt auf: die Keyframetabelle in der DRT ist 1:1 identisch mit der OTIO. Unsere Theorie: DRT kamen in 17 dazu, OTIO in 18.5; da OTIO einfach nicht komplett "durch definiert" sind (und vermutlich auch nicht werden, Du hast mich ja schon mal drauf aufmerksam gemacht, dass das eher brach liegt), hat BMD vermutlich einfach seine DRT Beschreibungen quasi 1:1.5 in der OTIO zum Einsatz gebracht. Da das Entpacken/Decoden der DRT mehr Processing kostet (wenn auch nicht viel, aber spürbar), nutze ich selber gerade einen Mix aus API Calls (für GetSource%Time() für Min/Max Werte) und die Keyframes+Tangenten aus der OTIO (ist auch weniger fehleranfällig, und beim Debuggen zumindest ohne weiteres lesbar).
Wir wollen eigentlich gern alles auch extern parsen, für die Pipeline. Ich komme mit dem erwähnten Workaround ganz gut klar; ich arbeite gerade an einer Workflow-Integration, um mehrspurige Burn-Ins zu realisieren. Dafür brauchts halt zuverlässige "Frame at Timeline Time" Daten, sonst kann man sich das schenken. Solang Retime-Kurven keine Tangenten haben, ist meine Methode auch in allen Tests 100% spot-on. Sobald Tangenten ins Spiel kommen, habe ich hin und wieder Abweichungen von 1 Frame in Kurven, möglicherweise Rundungsfehler (das gilt für die freien Tangenten in 21, die nur-waagerechten Tangenten aus 20, die nun auch als Option wieder kommen sollen(?) haben wir zwar in Grundzügen verstanden, aber keine brauchbare Mathematik für die Berechnung finden können; ich habe aber auch generell eine Meinung zu diesen Tangenten, haha). Da das alles reverse-engineered ist, kann natürlich auch einfach ein Detail für die Berechnung fehlen.
Die Integration will ich, wenn sie mal fertig ist (aktuell arbeite ich mehr oder weniger am Polishing, ich brauchte etwas Abstand vom Parsing, haha), dann auch FOSS zur Verfügung stellen (ein paar andere Tools, wo das praktisch für wäre, können wir wegen Interna blabla leider nicht zur Verfügung stellen; zugegeben sind die aber auch sehr speziell auf unsere Pipeline-Software zugeschnitten)
Jetzt hab ich hier sehr viel gesabbelt. Die Frage war ja: hast Du damit schon Erfahrung sammeln können? Vielleicht haben wir was übersehen, oder Du hast eine bessere Idee? Ich hab zB noch keinen längeren Blick in FCPXMLs geworfen, und auch nicht in AAFs die ja auch erst irgendwie "geknackt" werden müssten. Falls Du was hast, aber hier nicht teilen kannst/magst, können wir uns auch gern anders vernetzen. Bin selbstredend auch bereit, Infos zu "tauschen" :o)
___________________
Und weil ich noch nicht genug gesabbelt habe, eine kleine Anekdote zum Place-Cut-Call:
Wir nutzen das, um Schnitte von einer Spur auf eine andere zu übertragen (zB um Referenzen Anhand des Conforms zu zerschneiden); spart genug Zeit (und nerven) dass es sich lohnt. Wo es sich richtig gelohnt hat: als ich mit dem Parsen von Retime-Tangenten anfing, brauchte ich zum Prüfen die Frame/TC-Info von jedem Frame im Video. Das abzuschreiben dauert hundert Jahre. Dann dachte ich: zerhacken und mit GetSource%Time() die Info abgreifen, und per Spur in eine CSV schmeißen. Aber das Zerhacken dauert auch ewig, und weil die Testdaten groß sind, hängt es manchmal und dann überspringt man was usw usf, und hat es dann nicht korrekt. Also habe ich mir eine Spur mit Einzelframes vorbereitet (einfach ein Solid für 10f zerhackt, Copy+Paste, wieder Copy+Paste, usw, bis die Timeline voll ist), und dann das Schnitt-Übertragungstool genutzt um alles zu zerhacken. Die Timelines waren nie besonders lang, paar Minuten, aber alter Verwalter hat das ewig und drei Tage gedauert. Und beim ersten Mal hatte ich dann selber erfahren+gelernt, dass man nicht raus tabben kann, haha
Beste Grüße
ich schreibe hier nur in pausen auf der arbeit.