Wie man ein Overlay mit ffmpeg zu bestimmten Punkten an bestimmten Frames verschieben lässt

Im Folgenden sollte im Grunde ein Bild auf Frame 438 erscheinen, und dann sollte das gleiche Bild auf Frame 339 an eine andere Position verschoben werden und dann im Grunde für den Rest des Videos verschwinden.

ffmpeg -i C:\src\assets\video\base.mp4 -r 25 -i C:\card.png -y \
    -filter_complex [1:v]setpts=PTS-STARTPTS+(1/TB)[1v]; \
    [0:v][1v]overlay=x=0:y=0:enable='between(t,438/25,439/25)'[1v]; \
    [0:v][1v]overlay=x=300:y=300:enable='between(t,439/25,440/25)'[2v]; \
    [1v][2v]concat=n=2:v=1:a=0[out] -map [out] -map 0:a -ss 17 C:\temp\j7kthb0v\composit.mp4

Ich kann anscheinend den eigentlichen Befehl nicht richtig verstehen oder etwas ausgeben, das dem entspricht, was ich brauche.

Ich weiß, ich bin nah dran, ich kann einen Frame überlagern lassen, aber ich kann nicht mehr als das bekommen.

Antworten (1)

Verwenden

ffmpeg -i C:\src\assets\video\base.mp4 -i C:\card.png -y \
       -filter_complex "[0:v][1:v]overlay=x='if(eq(n,439),300,0)':y='if(eq(n,439),300,0)':enable='eq(n,438)+eq(n,439)'[out]" \
       -map [out] -map 0:a -ss 17 C:\temp\j7kthb0v\composit.mp4

Abhängig von Ihrer Shell müssen Sie möglicherweise die Kommas in Filtern maskieren, dh n,438->n\,438

Das ist großartig, danke, viel einfacher als mehrere Overlays
Ich habe dies im ursprünglichen Beitrag nicht gefragt, aber ich verwende diese Lösung für Animationen. Ich möchte im Grunde eine Position für X und Y basierend auf einer Bildnummer angeben. Ich kann dies erreichen, indem ich verschachtelt bin, wenn sonst die Hölle. aber gibt es einen schöneren Weg?
Nicht wirklich. Der Filter ist nicht für solche Animationen gedacht. Vereinfachen kannst du es etwa so:x='0*eq(n,438)+300*eq(n,439)+X*eq(n,567)+...'
Ich habe mit der Variablen n herumgespielt, in Überlagerung, wenn ich Folgendes tun würde: overlay=x='( 605 + -0.8023952095808383 * n)':y='( 406 + -0.4365269461077843 * n)':enable='between(t,438/25,605/25)'Bedeutet dies, dass n gleich 0 wäre und für jeden Frame, für den es sichtbar ist, inkrementiert würde? (605 - 438)
Diese Ausdrücke bedeuten, dass die Überlagerung bei (605.406) beginnt. Bei jedem Frame wird (0,80,0,43) subtrahiert und dann gerundet. Aber es ist nur sichtbar (an den berechneten Positionen) zwischen den Zeiten 17.56 und 24.20
Danke, ich habe diesen Teil verstanden, aber gilt: n == 0 bei Frame 438 und n == 1 bei Frame 439?
Nein, nist die Rahmen-Nr. Der erste Rahmen ist n = 0.
In meinem Beispiel wäre n also gleich 438, wenn es zum ersten Mal sichtbar ist?
Das stimmt...
Könnt ihr mir Tipps zum Zoompan geben? Ich versuche im Grunde, das Ende der Überlagerung anzuheften, einen Zoom-Effekt, der nach dem Startframe aus dem Bild herauszoomt (438 und inkrementiert auf einen Zoom von 0,43). Das habe ich versucht, aber es scheint keinen Zoom anzuwendenzoompan=z='if(gte(in,438),min(pzoom-0.04,0.43),1)':d=1
Zoompan kann nicht auf eine Leinwand herauszoomen, die größer als die Eingabe ist. Sie müssen das Video vorher auffüllen.
Ich verstehe nicht, was du mit diesem Kumpel meinst
Außerdem befindet sich der Zoom auf einer Ebene mit einem Überlagerungsbild. Wird der Zoom also nicht nur darauf angewendet?
Eigentlich kann ich jetzt auch den animierten Hintergrund sehen, verdammt
Stellt zoomden Zoomfaktor dar, wenn die Eingabebreite 100 beträgt, dann schneidet Zoom=2 ein Fenster mit einer Breite von 50 Pixeln aus. Der Zoom kann nicht unter 1 gehen. Sie müssen den Motivrahmen mit zusätzlichen Pixeln auffüllen (die transparent sein können) und dann auf diesen aufgefüllten Rahmen hinauszoomen.
Wenn also die Eingabebreite tatsächlich 1659 ist und das Hauptvideo 1920 ist, muss ich die Differenz zwischen den beiden auffüllen?
Zoompan arbeitet mit einer einzigen Eingabe. Wenn diese Eingabe das Ergebnis eines Overlay-Filters ist, weiß Zoompan nichts davon. Alles, was es sieht, ist das zusammengesetzte Bild. Posten Sie vielleicht ein neues Q mit einer Illustration dessen, was Sie zu tun versuchen.
Ich habe dies getan, video.stackexchange.com/questions/24339/… wenn es Ihnen nichts ausmacht, einen Blick darauf zu werfen, arbeiten Sie jetzt daran, diesem Beitrag ein GIF hinzuzufügen