新しいffmpegバージョンでは、scale
フィルターのforce_original_aspect_ratio
オプションを使用できます。たとえば、アップスケーリングせずにビデオを1280×720に収めるには(詳細はこの投稿を参照):
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
ここではscale
、入力ビデオがそれよりも大きい場合、フィルターは1280×720にスケーリングされます。小さい場合は拡大されません。pad
フィルタは、ターゲット・サイズのケースで1280×720に、そのアスペクト比またはサイズが異なるが、出力ビデオを持参する必要があります。
古いffmpegバージョンでは、多少ハックな回避策があります。まず、出力の幅、高さ、アスペクト比を定義します。これにより、タイピングの手間が省けます。
width=640; height=360
aspect=$( bc <<< "scale=3; $width / $height") # <= floating point division
ここで、ジムウォラルが書いた超複雑なフィルターコマンドを適用してみましょう。
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
私はこれが何をしているのかを説明するつもりはありませんが、基本的にはどんな動画でもフィードできます。準備ができている場合は、フィルターを個々の表現に分解できます。これを短くすることは可能かもしれませんが、それも同様に機能します。