42 votes

Faites un fondu enchaîné entre 2 vidéos en utilisant ffmpeg

J'ai essayé d'obtenir une transition de fondu enchaîné entre 2 clips vidéo en utilisant ffmpeg mais j'ai échoué jusqu'à présent. Je suis nouveau sur ffmpeg et je m'appuie principalement sur la modification de ce que je peux trouver dans la documentation et les exemples existants en ligne. D'après ce que j'ai lu jusqu'à présent, l'utilisation du filtre blend ou overlay devrait aider à obtenir ce que je recherche, mais je n'arrive pas à trouver les détails de la ligne de commande pour le faire fonctionner.

Les filtres fade et concat sont excellents pour les transitions de type fondu de la vidéo 1, fondu enchaîné vers la vidéo 2 et concaténation des 2 en un seul clip, mais j'apprécierais de l'aide pour obtenir une commande pour passer de la vidéo 1 à la vidéo 2 sans qu'il y ait de passage au noir entre les deux. Je n'ai trouvé aucun exemple pour ce problème précis nulle part, peut-être que je cherche avec les mauvais mots-clés... ?

Plus précisément, mes vidéos sont des mp4 (vidéo h264, sans son, au cas où cela serait important), chacune de 5 secondes et je recherche une transition d'environ 4,5 secondes de la vidéo 1 à 0,5 seconde de la vidéo 2.

Similaire à ce que fait ce tutoriel en utilisant MLT et des images (voir 2:25 pour un exemple de fondu), bien que je recherche un moyen de le faire juste avec ffmpeg sans appeler d'autres programmes. http://www.youtube.com/watch?v=3PRZ9L_KLdI

Tout conseil ou peut-être une ligne de commande pour obtenir un fondu comme celui-ci serait grandement apprécié, merci beaucoup !

36voto

ptQa Points 1979

Je suggère de procéder de la manière suivante :

  • Créez un arrière-plan noir avec la même durée et résolution que la vidéo de sortie
  • Ajoutez un canal alpha à chaque vidéo
  • Ajoutez un effet de fondu enchaîné à l'alpha de chaque vidéo
  • Utilisez un superposition sur chaque vidéo avec un arrière-plan noir

Donc, la commande pour ajouter un fondu enchaîné à 2 vidéos (5 sec chacune) devrait être :

ffmpeg -i 1.mp4 -i 2.mp4 -f lavfi -i color=black -filter_complex \
"[0:v]format=pix_fmts=yuva420p,fade=t=out:st=4:d=1:alpha=1,setpts=PTS-STARTPTS[va0];\
[1:v]format=pix_fmts=yuva420p,fade=t=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+4/TB[va1];\
[2:v]scale=960x720,trim=duration=9[over];\
[over][va0]overlay[over1];\
[over1][va1]overlay=format=yuv420[outv]" \
-vcodec libx264 -map [outv] out.mp4

Cela fera disparaître la première vidéo en alpha à la 4ème seconde (st=4) avec une durée de 1 seconde (d=1), fera apparaître la seconde à la 0ème seconde (st=0) avec une durée de 1 seconde (d=1), et avancera son affichage de 4 secondes (+4/TB). Ensuite, nous coupons simplement 9 secondes de couleur noire, la redimensionnons à la taille de la vidéo de sortie et superposons le tout.

J'espère que cela vous aide.

15voto

Ashish Points 920

FFmpeg dispose désormais d'un filtre de fondu enchaîné, sorti dans la version 4.3.

ffmpeg -i 1.mp4 -i 2.mp4 -filter_complex "xfade=offset=4.5:duration=1" output.mp4

De la même manière, il existe une version audio.

ffmpeg -i 1.mp4 -i 2.mp4 -filter_complex "xfade=offset=4.5:duration=1;acrossfade=duration=1" output.mp4

11voto

fisch2 Points 211

ffmpeg-concat est le moyen le plus simple d'accomplir ce que vous voulez et vous permet d'utiliser une variété de transitions OpenGL sexy, avec la valeur par défaut étant le fondu enchaîné.

ffmpeg-gl-transition est un filtre personnalisé ffmpeg qui vous permet d'utiliser GLSL pour effectuer une transition fluide entre deux flux vidéo. Ce filtre est nettement plus facile à utiliser et à personnaliser que les alternatives répertoriées ici.

Ce filtre prend en charge une large liste de types de transition, la valeur par défaut étant le fondu enchaîné.

./ffmpeg -i 0.mp4 -i 1.mp4 -filter_complex "gltransition=duration=4:offset=1.5" out.mp4

6voto

Erwan Points 93

C'est ainsi que j'ai fait :

  • Version ffmpeg N-77197-gdf2ce13
  • 2 vidéos de 4 secondes chacune.
  • Besoin de les joindre avec un fondu entre elles.
  • Les vidéos sont à 25 fps.

1) Ajouter un fondu de sortie (clair à sombre) à la fin de la première et un fondu d'entrée (sombre à clair) au début de la seconde :

ffmpeg -i 1.mp4 -y -vf fade=out:76:24 1f.mp4

ffmpeg -i 2.mp4 -y -vf fade=in:0:25 2f.mp4

76:24 signifie que le fondu de sortie commencera à l'image 76 et se terminera 24 images plus tard = 1s de fondu de sortie.

0:25 signifie que le fondu d'entrée commencera à l'image 0 et se terminera 25 images plus tard.

2) Fusionner les 2 vidéos

Convertir le tout en TS

ffmpeg -i 1f.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts 1f.ts

ffmpeg -i 2f.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts 2f.ts

Fusionner

ffmpeg -i "concat:1f.ts|2f.ts" -bsf:a aac_adtstoasc -c copy output.mp4

Merci à :

http://www.bogotobogo.com/FFMpeg/ffmpeg_fade_in_fade_out_transitions_effects_filters.php

2voto

Peter W. Osel Points 131

Pas sûr depuis combien de temps cela fonctionne déjà, mais au moins à partir de 2021, une solution plus simple est le propre xfade filtre de ffmpeg :

ffmpeg -i first.mp4 -i second.mp4 \
       -filter_complex "xfade=transition=fade:offset=60:duration=1" \
       out.mp4

... réalise un fondu enchaîné de first.mp4 à second.mp4 où la transition démarre à 60 secondes et dure 1 seconde.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X