Bei neueren ffmpeg-Versionen können Sie scale
die force_original_aspect_ratio
Filteroption verwenden. So passen Sie beispielsweise ein Video ohne Upscaling in 1280 × 720 ein ( weitere Informationen finden Sie in diesem Beitrag ):
ffmpeg -i input.mp4 -filter:v "scale='min(1280,iw)':min'(720,ih)':force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2" output.mp4
Hier scale
skaliert der Filter auf 1280 × 720, wenn das Eingangsvideo größer ist. Wenn es kleiner ist, wird es nicht hochskaliert. Der pad
Filter ist erforderlich, um das ausgegebene Video auf 1280 × 720 zu bringen, falls sein Seitenverhältnis oder seine Größe von der Zielgröße abweicht.
Bei älteren ffmpeg-Versionen gibt es eine etwas hackige Problemumgehung. Definieren Sie zunächst die Breite, Höhe und das Seitenverhältnis Ihrer Ausgabe. Dies erspart uns einige Eingaben.
width=640; height=360
aspect=$( bc <<< "scale=3; $width / $height") # <= floating point division
Wenden wir nun den super komplexen Filterbefehl an, den Jim Worrall geschrieben hat :
ffmpeg -i input.mp4 -vf "scale = min(1\,gt(iw\,$width)+gt(ih\,$height)) * (gte(a\,$aspect)*$width + \
lt(a\,$aspect)*(($height*iw)/ih)) + not(min(1\,gt(iw\,$width)+gt(ih\,$height)))*iw : \
min(1\,gt(iw\,$width)+gt(ih\,$height)) * (lte(a\,$aspect)*$height + \
gt(a\,$aspect)*(($width*ih)/iw)) + not(min(1\,gt(iw\,$width)+gt(ih\,$height)))*ih" \
output.mp4
Ich werde nicht wirklich erklären, was das alles macht, aber im Grunde kann man jedes Video füttern, und es wird nur verkleinert, nicht hochskaliert. Wenn Sie dazu bereit sind, können Sie den Filter in seine einzelnen Ausdrücke zerlegen. Es könnte möglich sein, dies zu verkürzen, aber es funktioniert auch so.