Stapeln Sie die Größe von Videos mit „Pan-and-Scan“-Zuschneiden

Ich versuche, eine Sammlung von ~ 120 Videoclips vorzubereiten, die im VLC Player abgespielt und auf einem Projektor mit niedriger Auflösung (1024 x 768) während eines DIY-Events für elektronische Musik projiziert werden sollen. Die Quellclips sind allesamt abstrakte Bilder in Super-Hi-Res im .mov-Format, jeweils etwa 4 GB groß. Sie haben verschiedene Seitenverhältnisse. Manche sind 4:3, andere 16:9, wieder andere 1:1 (quadratisch) usw.

Ich möchte alle Clips auf 1024 x 768 zuschneiden / skalieren und dabei ihre jeweiligen ursprünglichen Seitenverhältnisse beibehalten. Und ich möchte dies tun, ohne sie mit Letterboxing zu versehen und schwarze Balken entweder oben/unten oder links/rechts zu hinterlassen. Grundsätzlich möchte ich sie auf den Punkt reduzieren, an dem sie den Bildschirm von 1024 x 768 vollständig ausfüllen, und nicht kleiner. Ich glaube, das ist im Wesentlichen eine "Pan and Scan" -Technik?

(Es spielt keine Rolle, ob dabei ein Teil des Bildes entfernt wird – sie drehen nur geometrische Formen und dergleichen.)

Gibt es eine Möglichkeit, die Größe aller ~ 120 Videos im Stapel mit einem einzigen FFMPEG-Befehl zu ändern? Oder gibt es ein anderes Tool für Windows oder Linux, das funktionieren würde? Es ist mir egal, welches Ausgabeformat - nur etwas, das VLC abspielen kann, ohne abgehackt zu werden.

Antworten (1)

Wenn Sie nur 4:3- und 16:9-Videos hätten, würde ich vorschlagen:

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

Das würde ein Video auf eine Höhe von 768 skalieren und die Breite skalieren, um das Seitenverhältnis beizubehalten; und dann schneidet es die Breite auf 1024 zu, wobei die Höhe bei 768 bleibt. Die Tatsache, dass Sie auch 1: 1-Videos verwenden, macht die Sache komplizierter: Ein 3000 x 3000-Video würde auf 768 x 768 skaliert, und dann würde ffmpeg versuchen, es auf 1024 x 768 zuzuschneiden. was offensichtlich nicht funktionieren würde, da die Ernte nicht größer sein kann als der Input ...

Die einzige Möglichkeit, die ich mir vorstellen kann, um dies zum Laufen zu bringen, wäre, alle Videos zuzuschneiden, was Ihrer Meinung nach kein Problem wäre. Dadurch wird die Ausgabebreite so beschnitten, dass sie der Eingabehöhe entspricht, und die Ausgabehöhe auf 3/4 der Eingabehöhe; und dann wird das Video auf eine Höhe von 768 herunterskaliert, wobei das Seitenverhältnis mit der Breite beibehalten wird:

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

Dies funktioniert nur, wenn die Originaldateien eine Höhe von 1024 oder mehr haben. Beachten Sie, dass x264 nur eine gerade Breite oder Höhe akzeptiert, was zu Problemen führen kann (aber in diesem Fall nicht sollte).

Um jede .mov-Datei in einem Verzeichnis zu konvertieren, können Sie eine for-Schleife verwenden:

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

Um dies rekursiv zu tun, können Sie Folgendes verwenden 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}"' {} \;

All dies erfordert eine aktuelle Version von ffmpeg.