Ist es in FFMPEG möglich, die Skalierung im Laufe der Zeit zu ändern?

Ok, mit dem Overlay-Filter kann man also die x/y-Position eines Videos im Laufe der Zeit ändern, indem man die Variable "t" verwendet. Zum Beispiel overlay=x='if(gte(t,2), -w+(t-2)*20, NAN)':y=0kann verwendet werden, um ein überlagertes Element von links oben nach rechts oben zu verschieben, nachdem 2 Sekunden vergangen sind.

Ich möchte ein ähnliches Prinzip zum Skalieren von Elementen verwenden. Ich möchte in der Lage sein, den Maßstab eines Videos im Laufe der Zeit zu ändern, indem ich einen Ausdruck (wie, scale=w=iw*t, oder etwas in dieser Richtung) verwende.

Ist das möglich?

Wenn ich diesen Ausdruck durch -filter_complex laufen lasse, bekomme ich

Fehler beim Auswerten des Ausdrucks 'iw*t'.

Vielleicht ist der Ausdruck für out_w:'iw*t' oder für out_h:'-1' selbstreferenzierend.

Ich habe das Gefühl, dass es eine faire Chance gibt, dass ich FFMpeg patchen muss, wenn ich diese Funktionalität erhalten möchte, aber ich dachte, ich würde zuerst fragen, um zu sehen, ob jemand etwas über diese Art von Dingen weiß!

Weiß jemand, wie eine solche Aufgabe gelöst werden könnte?

Danke für die Hilfe!

Klingt im Moment eher nach einem Syntaxfehler, aber ich habe diese Funktion noch nie verwendet, daher kann ich hier leider nicht wirklich helfen.
Soweit ich das beurteilen kann, bleibt meine Syntax sauber und funktionsfähig, bis ich die Variable "t" einführe. Darüber hinaus scheint es nur sauer auf mich zu werden und Fehler zu werfen, egal was ich versuche :P
Also funktioniert alles, bis Sie hinzufügen *t?
*t, +t, alles was mit "t" zu tun hat. In allen anderen zeitanpassbaren Funktionen in libavfilter machen Sie es auf diese Weise dynamisch, indem Sie dem Ausdruck ein "t" hinzufügen. Damit verursacht die Einführung des "t" immer nur Fehler. Also frage ich mich, ob es eine Hintertür gibt, die ich vermisse, oder ob die Funktion einfach nicht existiert: P
Es ist keine definierte Sache, wenn es um Overlay-Filter geht.
Es wird in Bezug auf x- und y-Koordinaten des Overlays definiert. Sie können es in diesen Ausdrücken effektiv verwenden (siehe Dokumentation). Ich habe jedoch Probleme damit, dass es mit den Skalenwerten funktioniert.
Du könntest einfach einen Filter schreiben. wiki.multimedia.cx/index.php?title=FFmpeg_filter_howto
Als ich mir das letzte Mal ffmpeg-Ausdrücke angesehen habe, hatte ich Schwierigkeiten herauszufinden, welche Variablen für Ausdrücke in welchem ​​Filter verfügbar sind. Einige von ihnen unterstützen t, andere nicht. Die Neubewertung des Ausdrucks und die Neukonfiguration des Filters für jeden Frame ist für einige Filter teuer, daher nehme ich an, dass sie es deshalb nicht tun.
@theophilus777, hast du die Antwort auf deine Frage gefunden?
@alexspeller Der Skalenfilter unterstützt keine Timeline-Bearbeitung, daher nicht direkt möglich. Ich werde prüfen, ob es einen Workaround gibt.
@Mulvya Wie wäre es mit dem Extrahieren von Frames, dem Skalieren nach Bedarf und dem Zurücksetzen?
Technisch möglich mit H.264/5 Ausgabe. Ich weiß nicht, wie Spieler/Editoren damit umgehen werden.
Um ehrlich zu sein, kann dies definitiv erreicht werden, indem eine externe Anwendung geschrieben wird (z. B. in Python), in der die Skalierungsverhältnisse mit einem variierenden Faktor multipliziert werden können. Ich werde sehen, was ich tun kann. Alle Vorschläge sind willkommen.
@Mulvya Nein, Spieler können damit nicht umgehen. Sie brauchen eine konstante Rahmengröße. Variable Rahmen sollten zur Vervollständigung des Rahmens gepolstert werden.
Nicht wahr. Versuchen Sie Folgendes: Codieren Sie ein Video in einer bestimmten Größe, aber speichern Sie es als .TS. Codieren Sie ein anderes Video mit einer anderen Größe, aber denselben Codierungseinstellungen, und speichern Sie es als .TS. Verwenden Sie den Concat-Demuxer oder das Protokoll von FFmpeg, um zusammengeführtes MP4 zu erstellen. Spielen Sie in VLC oder Potplayer. Funktioniert hier. Wenn Sie in Potplayer die kbd-Verknüpfung verwenden, um die Größe des Player-Fensters auf die Videogröße zu ändern, wird die Größe auf neue Videoparameter geändert, wenn Sie die Taste drücken, wenn die Wiedergabe auf das 2. Video umgeschaltet hat. Wenn Ihr Encoder/Muxer mehrere SPS/PPS In-Band (dh in mdat) einfügt, unterstützen einige Player grundsätzlich die Kontext-Neuinstallation.
@alexspeller Was ist der Zweck der dynamischen Skalierung?

Antworten (1)

Soweit ich weiß, wird 't' einmal ausgewertet. Hast du das gelesen: https://ffmpeg.org/ffmpeg-filters.html#zoompan ?

Ffmpeg-Dokumente:

9.170.1 Beispiele

  • Vergrößern Sie bis zu 1,5 und schwenken Sie gleichzeitig zu einer Stelle in der Nähe der Bildmitte:

zoompan=z='min(zoom+0.0015,1.5)':d=700:x='if(gte(zoom,1.5),x,x+1/a)':y='if(gte(zoom, 1.5),y,y+1)':s=640x360

  • Bis zu 1,5 zoomen und immer in die Bildmitte schwenken:

zoompan=z='min(zoom+0.0015,1.5)':d=700:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)'

  • Wie oben, aber ohne Pause:

zoompan=z='min(max(zoom,pzoom)+0.0015,1.5)':d=1:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/ Zoom/2)'