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
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):
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):
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):
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