W nowszych wersjach ffmpeg możesz użyć opcji scale
filtra force_original_aspect_ratio
. Na przykład, aby zmieścić wideo w rozdzielczości 1280 × 720, bez skalowania (zobacz ten wpis, aby uzyskać więcej informacji):
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
Tutaj scale
filtr jest skalowany do 1280 × 720, jeśli wejściowe wideo jest większe. Jeśli jest mniejszy, nie będzie powiększany. pad
Filtr konieczny, aby wyjścia wideo do 1280 x 720, w razie jego proporcji lub wielkości różni się od wielkości docelowej jest.
W starszych wersjach ffmpeg istnieje dość hackujące obejście. Najpierw określ szerokość, wysokość i proporcje wydruku. Pozwoli nam to zaoszczędzić trochę pisania.
width=640; height=360
aspect=$( bc <<< "scale=3; $width / $height") # <= floating point division
Teraz zastosujmy polecenie super złożonego filtru, które napisał Jim Worrall :
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
Naprawdę nie będę wyjaśniać, co to wszystko robi, ale w zasadzie możesz go nakarmić dowolnym filmem, i to będzie tylko zmniejszanie, a nie zwiększanie. Jeśli masz na to ochotę, możesz podzielić filtr na poszczególne wyrażenia. Można to skrócić, ale tak też działa.