web-dev-qa-db-fra.com

Superposer des images animées avec transparence sur une image d'arrière-plan statique à l'aide de ffmpeg?

Je cherche à créer une vidéo en utilisant un ensemble d'images png dont la transparence est fusionnée avec un arrière-plan statique.

Après avoir fait beaucoup de fouilles, il semble que c'est définitivement possible en utilisant la bibliothèque de filtres.

Ma création vidéo initiale sans inclure l'arrière-plan est:

ffmpeg -y -qscale 1 -r 1 -b 9600 -loop -i bg.png -i frame_%d.png -s hd720 testvid.mp4

En utilisant -vf Je peux appliquer l'arrière-plan en superposition:

ffmpeg -y -qscale 1 -r 1 -b 9600 -i frame_%d.png -vf "movie=bg.png [wm];[in][wm] overlay=0:0 [out]" -s hd720 testvid.mp4

Cependant, le problème est qu'il superpose l'arrière-plan sur l'entrée. Selon libacfilter je peux diviser l'entrée et jouer avec son contenu. Je me demande si je peux en quelque sorte changer l'ordre de superposition?

Toute aide grandement appréciée!

MISE À JOUR 1:
J'essaie de faire fonctionner le filtre suivant mais j'obtiens le film sans l'arrière-plan:

ffmpeg -y -qscale 1 -r 1 -b 9600 -i frame_%d.png -vf "movie=bg.png [bg]; [in] split [T1], fifo, [bg] overlay=0:0, [T2] overlay=0:0 [out]; [T1] fifo [T2]" -s hd720 testvid.mp4

MISE À JOUR 2:
Création vidéo à l'aide de l'option -vf. Il suffit de canaliser la fente d'entrée sur laquelle il a appliqué l'image et de superposer les deux flux séparés! Probablement pas le moyen le plus efficace ... mais ça a marché!

ffmpeg -y -r 1 -b 9600 -i frame_%d.png -vf "movie=bg.png, scale=1280:720:0:0 [bg]; [in] format=rgb32, split [T1], fifo, [bg] overlay=0:0, [T2] overlay=0:0 [out]; [T1] fifo [T2]" -s hd720 testvid.mp4
25
Jona

L'ordre de superposition est contrôlé par l'ordre des entrées, à partir de les documents ffmpeg

[...] prend deux entrées et une sortie, la première entrée est la vidéo "principale" sur laquelle la deuxième entrée est superposée.

Votre deuxième commande devient ainsi:

ffmpeg -y -loop 1 -qscale 1 -r 1 -b 9600 -i frame_%d.png -vf "movie=bg.png [wm];[wm][in] overlay=0:0" -s hd720 testvid.mp4

Avec les dernières versions de ffmpeg, la nouvelle commande -filter_complex Rend le même processus encore plus simple:

ffmpeg -loop 1 -i bg.png -i frame_%d.png -filter_complex overlay -shortest testvid.mp4

Un exemple de travail complet:

La source de nos images d'entrée transparentes (excuses pour la danse):
Dancing banana
Décomposé en cadres avec ImageMagick :

convert dancingbanana.gif -define png:color-type=6 over.png

(La définition de png:color-type=6 (RGB-Matte) est cruciale car ffmpeg ne gère pas correctement la transparence indexée.) Les entrées sont nommées over-0.png, over-1.png, over-2.png, etc.

Notre image de fond (mise à l'échelle en banane):
Happy little mountain

En utilisant ffmpeg version N-40511-g66337bf (A git build d'hier), nous faisons:

ffmpeg -loop 1 -i bg.png -r 5 -i over-%d.png -filter_complex overlay -shortest out.avi

-loop Boucle l'entrée de l'image d'arrière-plan afin que nous n'ayons pas qu'un seul cadre, crucial!
-r Ralentit un peu la banane dansante, facultatif.
-filter_complex Est une fonction ffmpeg récemment ajoutée qui facilite la gestion de plusieurs entrées.
-shortest Termine l'encodage à la fin de l'entrée la plus courte, ce qui est nécessaire car boucler l'arrière-plan signifie que cette entrée ne se terminera jamais.

En utilisant une version légèrement moins avancée, ffmpeg version 0.10.2.git-d3d5e84:

ffmpeg -loop 1 -r 5 -i back.png -vf 'movie=over-%d.png [over], [in][over] overlay' -frames:v 8 out.avi

movie ne permet pas le réglage du taux, nous ralentissons donc l'arrière-plan à la place, ce qui donne le même effet. Étant donné que le film superposé n'est pas une entrée appropriée, nous ne pouvons pas utiliser -shortest Et au lieu de cela définir explicitement le nombre d'images à afficher sur le nombre d'images d'entrée superposées que nous avons.

Le résultat final (sortie sous forme de gif pour l'intégration):
Dancing banana with background

48
blahdiblah

pour les références à venir au 17/02/2015, la ligne de commande est:

ffmpeg -loop 1 -i images/background.png -i images/video_overlay%04d.png -filter_complex overlay=shortest=1 testvid.mp4

merci pour llogan qui a pris le temps de répondre ici: https://trac.ffmpeg.org/ticket/4315#comment:1

5
gabrielstuff