Redimensionner des vidéos par lots avec un recadrage «pan and scan»

8

J'essaie de préparer une collection de ~ 120 clips vidéo à lire dans VLC Player et projetés sur un projecteur basse résolution (1024x768) lors d'un événement de musique électronique DIY. Les clips source sont tous des visuels abstraits super haute résolution au format .mov, environ 4 Go chacun. Ils sont de différents formats. Certains sont 4: 3, d'autres 16: 9, d'autres 1: 1 (carré), etc.

Je voudrais recadrer / mettre à l'échelle tous les clips à 1024x768 tout en conservant leurs proportions d'origine respectives. Et, je voudrais le faire sans les mettre dans une boîte aux lettres et en laissant des barres noires en haut / en bas ou à gauche / à droite. Fondamentalement, ce que je voudrais faire, c'est de les réduire au point où ils remplissent entièrement l'écran 1024x768, et pas plus petit. Je crois que c'est essentiellement une technique "pan and scan"?

(Peu importe si une partie de l'image est supprimée au cours du processus - ils ne font que tourner des formes géométriques, etc.)

Existe-t-il un moyen de redimensionner toutes les ~ 120 vidéos en lot à l'aide d'une seule commande FFMPEG? Ou, existe-t-il un autre outil pour Windows ou Linux qui fonctionnerait? Peu m'importe le format de sortie - juste quelque chose que VLC peut jouer sans être saccadé.

Derrick Miller
la source

Réponses:

3

Si vous n'aviez que des vidéos 4: 3 et 16: 9, je suggérerais:

ffmpeg -i input.mov -filter:v 'scale=-1:768,crop=1024:ih' \
-c:v libx264 -crf 23 -preset veryfast output.mp4

Cela redimensionnerait une vidéo à une hauteur de 768, en ajustant la largeur pour conserver le rapport d'aspect; puis il recadre la largeur à 1024, en conservant la hauteur à 768. Le fait que vous utilisiez également des vidéos 1: 1 complique les choses: une vidéo 3000x3000 serait mise à l'échelle à 768x768, puis ffmpeg essaierait de la recadrer à 1024x768, ce qui évidemment ne fonctionnerait pas, car les récoltes ne peuvent pas être plus grandes que l'apport ...

La seule façon de penser à ce que cela fonctionne serait de recadrer toutes les vidéos, ce qui, selon vous, ne serait pas un problème. Cela rognera la largeur de sortie pour qu'elle soit identique à la hauteur d'entrée et la hauteur de sortie à 3/4 de la hauteur d'entrée; puis il réduira la vidéo à une hauteur de 768, en gardant le rapport d'aspect avec la largeur:

ffmpeg -i input.mov -filter:v 'crop=ih:3/4*ih,scale=-1:768' \
-c:v libx264 -crf 23 -preset veryfast output.mp4

Cela ne fonctionnera que si les fichiers d'origine ont une hauteur de 1024 ou plus. Notez que x264 accepte uniquement une largeur ou une hauteur uniforme, ce qui peut causer des problèmes (mais ne devrait pas dans ce cas).

Pour convertir chaque .mov dans un répertoire, vous pouvez utiliser une boucle for:

for f in *.mov; \
do ffmpeg -i "$f" -filter:v 'crop=ih:3/4*ih,scale=-1:768' \
-c:v libx264 -crf 23 -preset veryfast "${f/%mov/mp4}"; \
done

Pour le faire récursivement, vous pouvez utiliser find:

find . -type f -name *.mov -exec bash -c \
'ffmpeg -i "$0" -filter:v "crop=ih:3/4*ih,scale=-1:768" \
-c:v libx264 -crf 23 -preset veryfast "${0/%mov/mp4}"' {} \;

Tout cela nécessitera une version récente de ffmpeg.

evilsoup
la source