Bilder und Videos mit FFmpeg zuschneiden
Verwenden Sie den Filter crop von FFmpeg, um einen rechteckigen Teil
eines Bildes oder jedes Videobilds zu behalten. Zum Beispiel behält
crop=200:200:50:50 einen Bereich von 200×200, der 50 Pixel vom linken und 50 Pixel vom
oberen Rand entfernt beginnt. Im Folgenden schneiden Sie ein JPEG und ein MP4 zu, prüfen deren
Abmessungen und wenden den Bildzuschnitt mit Bash auf ein Verzeichnis an.
FFmpeg und Ihre Dateien vorbereiten
Führen Sie die Beispiele in Bash unter macOS oder Linux aus. Installieren Sie einen Build, der
ffmpeg, ffprobe und den Encoder
libx264 enthält; nutzen Sie dafür die Plattform-Links auf der
FFmpeg-Downloadseite. Die Befehle wurden mit FFmpeg 9.0.1 unter
macOS und 6.1.1 unter Ubuntu 24.04 getestet.
Prüfen Sie Ihre Installation:
ffmpeg -version && ffprobe -version && ffmpeg -hide_banner -h encoder=libx264
Der letzte Befehl sollte die Fähigkeiten des Encoders auflisten. Meldet er einen unbekannten
Encoder, installieren Sie einen Build mit libx264, bevor Sie fortfahren.
Legen Sie ein aufrecht stehendes JPEG namens input.jpg und ein MP4 namens
input.mp4 in Ihr Arbeitsverzeichnis. Das Bildbeispiel benötigt mindestens
250×250 Pixel; der feste Videozuschnitt benötigt mindestens 1280×720. Die Videobeispiele setzen
gewöhnliches SDR-Video mit quadratischen Pixeln und ohne Rotationsmetadaten voraus. Das
Zuschneiden von HDR-Material oder anamorphem Material erfordert eine zusätzliche Behandlung von
Farbe oder Seitenverhältnis.
Die Befehle für einzelne Dateien verwenden -y: Wenn Sie sie erneut
ausführen, werden die jeweils benannten Ausgabedateien ersetzt. Wählen Sie einen anderen
Ausgabenamen, um ein früheres Ergebnis zu behalten, und halten Sie die Ausgabenamen von Ihren
Eingabedateien getrennt. -nostdin deaktiviert die Tastaturinteraktion, damit
die Befehle auch unbeaufsichtigt funktionieren. Siehe die
Befehlsoptionen von FFmpeg.
Das Zuschneiderechteck wählen
Die Filtersyntax lautet crop=width:height:x:y. Die Koordinaten beginnen bei
(0,0) in der oberen linken Ecke; x nimmt nach
rechts zu und y nach unten. Das Zuschneiden entfernt Pixel außerhalb
des Rechtecks, ohne dessen Inhalt in der Größe zu ändern.
Damit ein Rechteck innerhalb der Eingabe bleibt, verwenden Sie positive Abmessungen und nicht
negative Versätze, wobei x + width nicht größer als die Breite der Eingabe und
y + height nicht größer als deren Höhe sein darf. Prüfen Sie diese Grenzen
selbst: FFmpeg kann einen außerhalb liegenden Versatz anpassen, damit das Rechteck hineinpasst,
statt einen Fehler zu melden.
Sie können x und y weglassen, um den
Ausschnitt zu zentrieren. Bei Eingaben mit Chroma-Subsampling rundet der Filter Koordinaten und
Abmessungen normalerweise auf das Subsampling-Raster ab. Die folgenden Beispiele verwenden gerade
Werte für das übliche Format 4:2:0. Die Referenz zu crop
von FFmpeg dokumentiert diese Standardwerte und die Option exact für
Ausschnitte, die ungerade Koordinaten benötigen.
Bilder mit FFmpeg zuschneiden
Schneiden Sie das oben beschriebene Rechteck zu und speichern Sie es als
cropped.png:
ffmpeg -hide_banner -nostdin -y -pattern_type none -i input.jpg \
-vf "crop=200:200:50:50" -frames:v 1 -update 1 cropped.png
-frames:v 1 schreibt ein Bild. PNG vermeidet nach dem Zuschneiden ein erneutes
verlustbehaftetes JPEG-Encoding. -pattern_type none macht den Eingabedateinamen
literal, während -update 1 dasselbe für den Ausgabedateinamen bewirkt. Diese
Optionen sind auch dann wichtig, wenn ein Dateiname %03d enthält, was
FFmpeg sonst als Muster für eine Bildsequenz behandeln würde. Diese Verhaltensweisen sind in den
Bild-Eingabeoptionen und den
Bild-Ausgabeoptionen dokumentiert.
Prüfen Sie die Abmessungen der Ausgabe mit ffprobe:
ffprobe -v error -select_streams v:0 -show_entries stream=width,height \
-of csv=p=0:s=x cropped.png
Das sollte 200x200 ausgeben. Öffnen Sie auch das PNG: Die Abmessungen allein
sagen nichts darüber aus, ob Sie das beabsichtigte Motiv behalten haben.
Videos mit FFmpeg zuschneiden
Behalten Sie den Bereich von 1280×720 oben links in jedem Frame von
input.mp4:
ffmpeg -hide_banner -nostdin -y -i input.mp4 \
-map 0:v:0 -map '0:a:0?' -vf "crop=1280:720:0:0" \
-c:v libx264 -crf 18 -pix_fmt yuv420p -c:a aac -b:a 128k cropped.mp4
Die Ausgabe enthält H.264-Video und, sofern vorhanden, die erste Audiospur, codiert als AAC. Das
in Anführungszeichen gesetzte ? macht das Audio-Mapping optional,
sodass auch stumme Eingaben funktionieren. Weitere Videospuren, Audiospuren und Untertitel werden
weggelassen. Siehe die Dokumentation zum Stream-Mapping.
Das Zuschneiden erfordert, das Video zu decodieren und neu zu codieren, daher lässt sich
-c:v copy nicht mit diesem Filter kombinieren.
-crf 18 ist eine
Qualitätseinstellung für das verlustbehaftete H.264-Encoding.
-pix_fmt yuv420p wählt eine Ausgabe in 4:2:0, die mit diesem Encoder eine gerade
Breite und Höhe erfordert.
Ein zentriertes Quadrat zuschneiden
Wählen Sie für Videos im Quer- oder Hochformat die kleinere Eingabeabmessung und runden Sie sie auf eine gerade Zahl ab:
ffmpeg -hide_banner -nostdin -y -i input.mp4 \
-map 0:v:0 -map '0:a:0?' -vf "crop=w='trunc(min(iw,ih)/2)*2':h=ow" \
-c:v libx264 -crf 18 -pix_fmt yuv420p -c:a aac -b:a 128k square.mp4
Dabei sind iw und ih die Abmessungen der
Eingabe und ow ist die berechnete Zuschnittbreite. Wenn Sie
x und y weglassen, wird das Quadrat
zentriert, vorbehaltlich der oben beschriebenen Rundung auf das Chroma-Raster. Eine Eingabe mit
1920×1080 ergibt 1080×1080 Pixel. Dies ist ein fester zentrierter Zuschnitt, sodass ein Motiv nahe
am Rand dennoch abgeschnitten werden kann.
Die Videoausgabe prüfen
Untersuchen Sie die Abmessungen und Codecs mit den
ausgewählten Einträgen von ffprobe:
ffprobe -v error -show_entries stream=codec_type,codec_name,width,height \
-of json cropped.mp4
Erwarten Sie einen Video-Stream mit h264, der Breite
1280 und der Höhe 720, dazu einen Stream mit
aac, falls die Eingabe Audio enthielt. Ersetzen Sie
cropped.mp4 durch square.mp4, um den quadratischen Zuschnitt
zu prüfen. Spielen Sie das Ergebnis ab, um Bildausschnitt und Ton über den gesamten Clip hinweg zu
kontrollieren.
JPEG-Bilder im Stapel zuschneiden
Speichern Sie dies als crop-images.sh und führen Sie
bash crop-images.sh in dem Verzeichnis aus, das Ihre JPEGs enthält. Das Skript
verarbeitet nicht versteckte Dateien in diesem Verzeichnis, die auf ein kleingeschriebenes
.jpg enden, und verwendet dafür denselben Zuschnitt von 200×200 bei
(50,50). Jede Eingabe muss das Minimum von 250×250 für dieses Rechteck
erfüllen.
#!/usr/bin/env bash
set -euo pipefail
shopt -s nullglob
images=(./*.jpg)
if (( ${#images[@]} == 0 )); then
printf '%s\n' 'No .jpg files found.' >&2
exit 1
fi
mkdir ./cropped
for image in "${images[@]}"; do
name=${image##*/}
ffmpeg -hide_banner -loglevel error -nostdin -y \
-pattern_type none -i "$image" -vf "crop=200:200:50:50" \
-frames:v 1 -update 1 "./cropped/${name%.jpg}.png"
done
Das Skript benötigt ein neues Verzeichnis cropped: Wenn es bereits
existiert, schlägt mkdir fehl und das Skript bricht ab, bevor
irgendetwas verarbeitet wird. Behalten Sie die Ergebnisse in diesem Verzeichnis und wählen Sie für
einen weiteren Durchlauf ein neues Ausgabeverzeichnis im Skript. Die Ausgaben sind PNG-Dateien in
einem Unterverzeichnis, sodass sie beim nächsten Durchlauf nicht zu Eingaben werden können.
Die Anführungszeichen und das Präfix ./ behandeln Leerzeichen und
führende Bindestriche in Dateinamen; die Bildoptionen behandeln literale Prozentmuster auf beiden
Seiten. Ein leeres Verzeichnis führt zu einem Fehler. Wenn FFmpeg bei einem nicht lesbaren Bild
oder einem zu kleinen Zuschnitt fehlschlägt, bricht das Skript ab; bereits geschriebene Dateien
verbleiben in cropped, prüfen Sie daher etwaige Teilergebnisse, bevor Sie es
erneut versuchen.
