Con le versioni più recenti di ffmpeg, è possibile utilizzare l' opzione scale
del filtro force_original_aspect_ratio
. Ad esempio, per adattare un video a 1280 × 720, senza l'upscaling (vedi questo post per maggiori informazioni):
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
Qui, il scale
filtro viene ridimensionato a 1280 × 720 se il video in ingresso è più grande di quello. Se è più piccolo, non verrà ingrandito. Il pad
filtro è necessario per portare il video in uscita a 1280 × 720, nel caso in cui le sue proporzioni o dimensioni differiscano dalle dimensioni target.
Con le versioni precedenti di ffmpeg, esiste una soluzione alquanto confusa. Innanzitutto, definire la larghezza, l'altezza e le proporzioni dell'output. Questo ci farà risparmiare un po 'di battitura.
width=640; height=360
aspect=$( bc <<< "scale=3; $width / $height") # <= floating point division
Ora, applichiamo il comando di filtro super complesso che Jim Worrall ha scritto :
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
Non spiegherò davvero cosa fa tutto questo, ma fondamentalmente puoi alimentare qualsiasi video e ridurrà solo in scala, non in scala. Se sei pronto, puoi sezionare il filtro nelle sue espressioni individuali. Potrebbe essere possibile accorciare questo, ma funziona anche così.