Com as versões mais recentes do ffmpeg, você pode usar a opção scale
do filtro force_original_aspect_ratio
. Por exemplo, para ajustar um vídeo em 1280 × 720, sem melhorar (consulte esta postagem para obter mais informações):
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
Aqui, o filtro scale
é dimensionado para 1280 × 720 se o vídeo de entrada for maior que isso. Se for menor, não será melhorado. O filtro pad
é necessário para levar o vídeo de saída a 1280 × 720, caso sua proporção ou tamanho seja diferente do tamanho desejado.
Com as versões mais antigas do ffmpeg, há uma solução um tanto hacky. Primeiro, defina a largura, a altura e a proporção da sua saída. Isso nos poupará alguma digitação.
width=640; height=360
aspect=$( bc <<< "scale=3; $width / $height") # <= floating point division
Agora, vamos aplicar o comando de filtro super complexo que Jim Worrall escreveu :
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
Eu não vou realmente explicar o que isso tudo faz, mas basicamente você pode alimentar qualquer vídeo, e ele só vai diminuir, não upscale. Se você está pronto para isso, você pode dissecar o filtro em suas expressões individuais. Talvez seja possível encurtar isso, mas também funciona assim.