AviSynth ChangeFPS: Kombinieren von Videos mit unterschiedlichen Frameraten

2383
Daniel Saner

Ich habe zwei Videoaufnahmen derselben Szene, aber mit unterschiedlichen Frameraten, die ich mit einem AviSynth-Skript kombinieren möchte. Ein Video wird mit 30 Bildern pro Sekunde aufgenommen, das andere mit 120 Bildern pro Sekunde. Ich möchte sie zeitlich synchron halten, was bedeutet, dass die Ausgabe für jeden Frame des 30-fps-Videos 4 Frames des 120-fps-Videos anzeigen soll. Ich möchte, dass das endgültige Ausgangsvideo mit 30 Bildern pro Sekunde abgespielt wird, so dass die Dauer der ursprünglichen Aufnahmen 4 Mal so groß ist.

In der AviSynth-Dokumentation scheint ChangeFPSes sich um die Funktion zu handeln, die ich brauche, da Frames entfernt und dupliziert werden, während 'AssumeFPS' lediglich die Wiedergabegeschwindigkeit ändert (und mein Plan ist im Grunde, jeden Frame des 30-fps-Clips zu vervierfachen). Der Filter scheint jedoch nicht das zu tun, was er sagt.

Wenn ich es versuche:

clip30 = AviSource("0326.avi").ChangeFPS(120) clip120 = AviSource("0326-120fps.avi") 

Es hat keinen Einfluss auf die Wiedergabegeschwindigkeit oder die Bildanzahl des 30-fps-Clips, entfernt jedoch jeden vierten Frame aus dem 120-fps-Clip. Dies ist überhaupt nicht das, was ich will. Das Anhängen von .ChangeFPS (7.5) an den Clip120 hat jedoch leider nicht denselben umgekehrten Effekt - in diesem Fall wird genau das gemacht, was zu erwarten ist. Alternativ, wenn ich versuche:

clip30 = AviSource("0326.avi").AssumeFPS(7.5) clip120 = AviSource("0326-120fps.avi") 

Es gibt keinen Effekt, beide Clips werden mit 30 Bildern pro Sekunde abgespielt, was bedeutet, dass nur ein Viertel des Clips mit 120 Bildern pro Sekunde bis zum Ende des Clips mit 30 Bildern pro Sekunde gezeigt wurde.

Wie kann ich diese beiden Clips so kombinieren, wie ich es möchte? Ich konnte keine anderen internen oder externen Filter finden, die mir dabei helfen würden. Es scheint mir, wenn ChangeFPSdas, was das Handbuch sagt, das Richtige für die Arbeit wäre.

4
Wie willst du sie kombinieren? In einem vertikalen / horizontalen Spalt oder etwas anderem? .... `clip30 = AviSource (" 0326.avi "). ChangeFPS (120)` funktioniert gut für mich, dh. Es gibt ein Video mit 120 FPS aus, das genau so läuft wie der ursprüngliche 30-FPS-Clip. Peter.O vor 12 Jahren 0
Ich habe sowohl ein Skript zum Stapeln als auch eines für Layer / Blending. Aber es sollte keine Rolle spielen, das Problem war nur, dass ich die beiden Clips nicht bei verschiedenen Framerates spielen konnte. Was ich herausbekam, war immer ein 30-fps-Video, bei dem eines der beiden Probleme auftrat, das ich in der Frage beschrieben hatte. Ich habe jetzt herausgefunden, was ich falsch gemacht habe, ich schreibe die Antwort nur schnell heraus. Daniel Saner vor 12 Jahren 1

1 Antwort auf die Frage

2
Daniel Saner

Ich habe mein Problem gelöst, indem ich den ersten Ausschnitt aus meiner Frage verwendet habe (die Framerate des 30-fps-Clips wurde auf 120fps geändert), dann aber auch AssumeFPS(30)das endgültige kombinierte Video eingestellt, indem diese Funktion an das Ende des letzten Filters angehängt wurde . Also zum Beispiel:

clip30 = AviSource("0326.avi").ChangeFPS(120) clip120 = AviSource("0326-120fps.avi") StackHorizontal(clip30, clip120).AssumeFPS(30) 

funktioniert gut. Ich habe jetzt ein Video, das die Dauer des 120fps-Clips mit 30fps (viermal die ursprüngliche Aufnahmedauer) mit jedem Frame der 30fps vervierfacht, so wie ich es wollte.

Ich weiß nicht genau, warum das Finale AssumeFPS(30)notwendig war, da der Clip, den ich ohne bekomme, auch 30fps beträgt. Ich habe die Ausgabe Frame für Frame in AviDemux überprüft, und ohne diesen abschließenden Aufruf von AssumeFPSwerden die Frames clip30nicht vervierfacht, wie sie sollten.