web-dev-qa-db-fra.com

FFmpeg: Comment convertir une vidéo verticale avec des côtés noirs, en vidéo 16: 9, avec des arrière-plans flous

Vertical video with blurred background sides

Comment faire cela en utilisant FFmpeg?  

Exemple sans FFmpeg:
Adobe After Effects
Sony Vegas Pro

17
Andrey

J'ai résolu!

ffmpeg -i input.mp4 -lavfi '[0:v]scale=ih*16/9:-1,boxblur=luma_radius=min(h\,w)/20:luma_power=1:chroma_radius=min(cw\,ch)/20:chroma_power=1[bg];[bg][0:v]overlay=(W-w)/2:(H-h)/2,crop=h=iw*9/16' -vb 800K output.webm

Entrée: https://www.youtube.com/watch?v=17uHCHfgs60
Résultat: http://www.youtube.com/watch?v=CgZsDLfzrTs

31
Andrey

Vous pouvez essayer de superposer la vidéo sur une image floue comme ceci.

ffmpeg -i input_video -loop 1 -i input_image -t 10 -filter_complex "
[0:v]scale=-1:720[scaled_video];
[1:v]scale=1280:720,boxblur=50[blur_image];
[blur_image][scaled_video]overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2[outv]" -c:v libx264 -aspect 1280/720 -map [outv] -map 0:a -c:a copy output_video

L'image d'entrée sera bouclée pendant la durée de la vidéo de sortie par -loop 1. Et -t 10 limitera la durée de la sortie vidéo à 10 secondes. Dans cet exemple, j'ai utilisé 1280: 720 comme résolution vidéo de sortie et mis à l'échelle les entrées pour correspondre à ce rapport. 0:v fait référence à la vidéo d'entrée et sera mise à l'échelle jusqu'à une hauteur de 720 où la largeur sera ajustée en conséquence.

Ici, j'ai utilisé boxblur filter où il y en a plusieurs autres comme sab, smartblur et unsharp. map obtiendra les flux d'entrée traités spécifiés et les mappera en conséquence sur le flux de sortie.

J'espère que ceci vous aidera!

2
Chamath

Je ne pouvais obtenir aucune des solutions précédentes fournies pour utiliser ffmpeg 3.4.2 sous Windows.

Cependant cela a fonctionné:

ffmpeg -i <input_file> -filter_complex "[0:v]scale=ih*16/9:-1,boxblur=luma_radius=min(h\,w)/20:luma_power=1:chroma_radius=min(cw\,ch)/20:chroma_power=1[bg];[bg][0:v]overlay=(W-w)/2:(H-h)/2,crop=h=iw*9/16" <output_file>

N'oubliez pas de remplacer <input_file> et <output_file> par les noms de fichiers appropriés.

1
Richard

La réponse acceptée ici prend une éternité à exécuter car elle nécessite beaucoup de calculs inutiles. Nous n'avons pas besoin de flouter les pixels, car nous savons assurément que la vidéo en sortie ne sera pas visible.

Une meilleure solution serait donc d’abord de rogner la partie de la vidéo qui sera visible dans la sortie. Nous redimensionnons ensuite cette partie pour "remplir" la fenêtre. Enfin, nous superposons la vidéo originale.

Below example assumes that input video has greater
aspect ratio than output video.
                    ┌─────────────┐
┌─────────────┐     │             │
│ Input video │     │   Output    │
│             │     │   video     │
└─────────────┘     │             │
                    │             │
                    └─────────────┘

Nous allons utiliser filtre graphique pour y parvenir. Notre filtre sera comme ci-dessous en notation par points:

                [original]
 input --> split -------------------------------> overlay --> output
        │                                          ^
        │[copy]                           [blurred]│
        └──────> crop ──> scale ──> gblur ─────────┘

En supposant que la résolution de l'entrée vidéo soit de 1280 x 720, la commande se présente comme suit:

ffmpeg -i input.mp4 -vf 'split [original][copy]; [copy] crop=ih*9/16:ih:iw/2-ow/2:0, scale=1280:2282, gblur=sigma=20[blurred]; [blurred][original]overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2' output.mp4
1
Abhinav Chauhan