web-dev-qa-db-fra.com

Créer une vidéo avec 5 images avec effet fadeIn / out dans ffmpeg

Avec 5 images, je dois créer une vidéo de 60 secondes dans ffmpeg, chaque image doit être affichée pendant 15 secondes. après 15 secondes, la première image doit disparaître et la deuxième image doit disparaître, après que la deuxième image doit disparaître, la troisième image doit apparaître en fondu, etc. Merci de me guider, comment puis-je y parvenir en utilisant les commandes ffmpeg.

25
user384847

Tremper/disparaître au noir

Faites défiler vers le bas pour la méthode de fondu enchaîné.

fade example

Exemple où chaque image est affichée pendant 5 secondes et dont chacune a un fondu qui dure 1 seconde. Chaque entrée d'image a la même largeur, la même hauteur et le même rapport d'aspect. Si leur taille varie, voir l'exemple # 3 ci-dessous.

Sortie MP4

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" out.mp4

Avec audio

Comme ci-dessus mais avec audio:

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-i audio.m4a \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" -map 5:a -shortest out.mp4

Pour les images d'entrée de tailles variables ou arbitraires

Comme dans le premier exemple, mais avec des images d'entrée de largeur x hauteur différentes. Ils seront rembourrés pour tenir dans une boîte 1280x720:

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=out:st=4:d=1[v0]; \
 [1:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" out.mp4

Voir les exemples dans Redimensionnement des vidéos pour s’adapter à un lecteur de taille statique si vous souhaitez recadrer (remplir l’écran) à la place du pavé (letterbox/pillarbox), ou si vous voulez empêcher l'upscaling.

Sortie GIF

Ajoute les filtres de Comment convertir une vidéo en GIF en utilisant ffmpeg, avec une qualité raisonnable?

ffmpeg \
-framerate 10 -loop 1 -t 5 -i input0.png \
-framerate 10 -loop 1 -t 5 -i input1.png \
-framerate 10 -loop 1 -t 5 -i input2.png \
-framerate 10 -loop 1 -t 5 -i input3.png \
-framerate 10 -loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,split[v0][v1]; \
 [v0]palettegen[p];[v1][p]paletteuse[v]" -map "[v]" out.gif

Utilisez l'option de sortie -loop pour contrôler le nombre de fois que les boucles GIF sont en boucle. La valeur par défaut est une boucle infinie si cette option n'est pas utilisée. Une valeur de -1 n'est pas une boucle.

Options et filtres utilisés:

  • -t pour définir la durée en secondes de chaque entrée.

  • -loop 1 boucle l'image, sinon sa durée serait d'une image.

  • -framerate pour définir le taux de trame de l'image d'entrée (la valeur par défaut lorsque non déclaré est 25). Utile pour faire du GIF.

  • échelle avec le pavé numérique pour ajuster les images d'entrée à une taille uniforme et spécifique (utilisé dans l'exemple n ° 3).

  • fondu pour faire un fondu en entrée et en sortie. d est la durée du fondu. st c'est quand ça commence.

  • concat pour concaténer (ou "joindre") chaque image.

  • format pour produire un schéma de sous-échantillonnage de chrominance compatible avec les lecteurs non basés sur FFmpeg en sortie de MP4 et encodé avec libx264 (l'encodeur par défaut pour la sortie de MP4 s'il est soutenu par votre construction).

  • split pour créer des copies d'une sortie de filtre. Nécessaire par la palette * filtres pour tout faire en une seule commande.

  • palettegen et paletteuse pour obtenir un rendu GIF agréable à regarder.


Fondu enchaîné

crossfade example

Exemple où chaque image est affichée pendant 5 secondes et où chacune a un fondu enchaîné qui dure 1 seconde. Chaque entrée d'image a les mêmes largeur, hauteur et exemple de format d'image. Si leur taille varie, adaptez l'exemple n ° 3 ci-dessus.

Sortie MP4

ffmpeg \
-loop 1 -t 5 -i 1.png \
-loop 1 -t 5 -i 2.png \
-loop 1 -t 5 -i 3.png \
-loop 1 -t 5 -i 4.png \
-loop 1 -t 5 -i 5.png \
-filter_complex \
"[1]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3]; \
 [bg3][f3]overlay,format=yuv420p[v]" -map "[v]" -movflags +faststart out.mp4

Avec audio

ffmpeg \
-loop 1 -t 5 -i 1.png \
-loop 1 -t 5 -i 2.png \
-loop 1 -t 5 -i 3.png \
-loop 1 -t 5 -i 4.png \
-loop 1 -t 5 -i 5.png \
-i music.mp3 \
-filter_complex \
"[1]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3]; \
 [bg3][f3]overlay,format=yuv420p[v]" -map "[v]" -map 5:a -shortest -movflags +faststart out.mp4

Sortie GIF

ffmpeg \
-framerate 10 -loop 1 -t 5 -i 1.png \
-framerate 10 -loop 1 -t 5 -i 2.png \
-framerate 10 -loop 1 -t 5 -i 3.png \
-framerate 10 -loop 1 -t 5 -i 4.png \
-framerate 10 -loop 1 -t 5 -i 5.png \
-filter_complex \
"[1]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3];[bg3][f3]overlay,split[v0][v1]; \
 [v0]palettegen[p];[v1][p]paletteuse[v]" -map "[v]" out.gif

Utilisez l'option de sortie -loop pour contrôler le nombre de fois que les boucles GIF sont en boucle. La valeur par défaut est une boucle infinie si cette option n'est pas utilisée. Une valeur de -1 n'est pas une boucle.

44
llogan

J'ai écrit un script bash général qui prend un chemin d'accès vers un dossier d'images et génère une vidéo de fondu enchaîné avec ffmpeg:

https://Gist.github.com/anguyen8/d0630b6aef6c1cd79b9a1341e88a573e

Le script examine essentiellement les images d'un dossier et imprime une commande similaire à la réponse de @LordNeckbeard ci-dessus, puis exécute la commande. Ce script vous aide lorsque vous avez plusieurs images dans un dossier et que vous ne voulez pas taper manuellement une commande d'une longueur déprimante.

3
anh_ng8