動画の解像度(縦横のピクセル数)は、FFmpeg の scale フィルタで変えられます。幅か高さの片方に -2 を指定すると、アスペクト比(縦横比)を保ったまま、もう片方が自動で決まります。


拡大アルゴリズムの比較。左が flags=neighbor で階段状にギザついた状態、右が flags=lanczos で滑らかな状態

同じ画像を 1/4 に縮小してから元のサイズへ戻したもの。左が flags=neighbor、右が flags=lanczos。等倍(1:1)の切り出しなので、Tシャツの柄のギザつきの差がそのまま見えます。

素材: Tears of Steel (CC) Blender Foundation | mango.blender.org、CC BY 3.0。映画の1フレームを切り出し、フィルターで加工しています。

scaleフィルタの基本構文

ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4
部分 説明
-vf 映像フィルタを指定するオプション(-filter:v と同義)
scale=幅:高さ 出力の幅と高さをピクセルで指定

上の例は 1280×720 に変換します。元の動画と縦横比が違うと、FFmpeg はピクセルの縦横比(SAR)を書き換えて、見た目の縦横比を元のままにします。たとえば 640×480(4:3)の動画は、1280×720 になっても 4:3 で表示されます。SAR が記録されていない動画では、映像が縦か横に引き伸ばされます。ふつうは次の -2 を使い、片方だけを指定してください。

アスペクト比の自動保持

-1 と -2 の違い

幅か高さの片方を -1 か -2 にすると、もう片方の値と元の縦横比から自動で計算されます。

値 動作
-1 アスペクト比を保持して自動計算。奇数になる可能性がある
-2 アスペクト比を保持しつつ2の倍数に丸める(yuv420p の H.264 に必須)

H.264 でふつうに使う yuv420p 形式は、幅や高さが奇数だとエラーになります。そのため -2 を使ってください。

幅を固定して高さを自動計算

ffmpeg -i input.mp4 -vf scale=1280:-2 output.mp4

1920×1080 の動画なら、1280×720 になります。

高さを固定して幅を自動計算

ffmpeg -i input.mp4 -vf scale=-2:720 output.mp4

1920×1080 の動画なら、こちらも 1280×720 になります。

相対サイズ変更(iw / ih 変数)

iw は元の幅、ih は元の高さを表します。これを使うと「元の半分」のように、元のサイズを基準にした指定ができます。

半分のサイズに縮小

ffmpeg -i input.mp4 -vf scale=iw/2:ih/2 output.mp4

1.5倍に拡大

ffmpeg -i input.mp4 -vf scale=iw*1.5:ih*1.5 output.mp4

アスペクト比保持で幅を2分の1に

ffmpeg -i input.mp4 -vf scale=iw/2:-2 output.mp4

iw と ih を使えば、元の解像度を調べなくても、同じコマンドをどの動画にも使い回せます。

最大解像度制限

「幅は 1920 ピクセルまで。それより小さい動画はそのまま」という指定です。4K の素材をフル HD の幅(1920px)に抑えたいときなどに使います。min(1920,iw) は、1920 と元の幅(iw)のうち小さいほうを選びます。

ffmpeg -i input.mp4 -vf "scale='min(1920,iw)':-2" output.mp4

元の幅が 1920 未満ならそのまま、1920 以上なら 1920 に縮小します。高さは -2 で、縦横比を保ったまま自動で計算されます。

式の中のカンマ(,)は、FFmpeg ではフィルタの区切りとして扱われます。'min(1920,iw)' のように式をシングルクォートで囲むと、カンマが式の一部になります。外側のダブルクォートは、このシングルクォートをシェルに取り除かれないようにするためのものです。シングルクォートのない -vf "scale=min(1920,iw):-2" は、No such filter: 'iw):-2' というエラーになります。

パディング(pad)で黒帯を付ける

縦横比の違う映像を決まったサイズの枠に収めたいときは、scale と pad を組み合わせます(例: 4:3 の映像を、左右に黒帯の付いた 1920×1080 で出力する)。scale で縦横比を保ったまま枠に収まる最大のサイズに拡大・縮小し、pad で足りない部分を黒い帯で埋めます。640×480 の映像なら 1440×1080 に拡大され、左右に 240 ピクセルずつ黒帯が付きます。

ffmpeg -i input.mp4 -vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2" output.mp4
部分 説明
scale=1920:1080:force_original_aspect_ratio=decrease アスペクト比を保ちながら、1920×1080に収まる最大サイズに拡大・縮小
pad=1920:1080:(ow-iw)/2:(oh-ih)/2 1920×1080の枠に中央配置でパディング

帯の色は、指定しなければ黒(black)です。白にしたいときは pad=...:color=white のように書きます。

出力ピクセルフォーマットの指定

ピクセルフォーマットは、画素の色をどう記録するかの形式です。H.264 で書き出すときは yuv420p を指定しておくと、多くのプレーヤーで再生しやすくなります。

ffmpeg -i input.mp4 -vf scale=1280:-2 -pix_fmt yuv420p output.mp4

-pix_fmt の代わりに、フィルタの後ろに format=yuv420p をつなげる書き方もあります。

ffmpeg -i input.mp4 -vf "scale=1280:-2,format=yuv420p" output.mp4

よく使うコマンドまとめ

ffmpeg -i input.mp4 -vf scale=1920:1080 output.mp4
ffmpeg -i input.mp4 -vf scale=1280:-2 output.mp4
ffmpeg -i input.mp4 -vf scale=-2:720 output.mp4
ffmpeg -i input.mp4 -vf scale=iw/2:ih/2 output.mp4

実測: 処理時間とサイズ

次のコマンドで、処理時間と出力サイズを測りました。

ffmpeg -i input.mp4 -vf scale=1280:720 -c:v libx264 -crf 23 -preset medium -an output.mp4
項目 実測値
処理時間 18.43 秒(実時間の 6.51 倍速)
出力サイズ 41.14 MB
無フィルタ再エンコード(ベースライン)比 -52.3%

計測環境: Intel Core i9-14900KF(32スレッド)/ FFmpeg 8.1(gyan.dev)/ 素材は 1920x1080・30fps・120秒・351.4 MB(Big Buck Bunny をループ、CC BY 3.0)。2026-09-05 に、計測を同時に走らせず順番に実行しました。生データはデータセットで公開しています。

なぜこの数字になるのか

フィルタを足したほうが、速く終わりました。同じ素材を 1080p のまま、フィルタなしで再エンコードすると 27.97 秒です。-vf scale=1280:720 で 720p に縮小すると 18.43 秒でした。scale の処理が増えたのに、全体の時間は短くなっています。

時間のほとんどを使っているのが、scale ではなく x264 のエンコードだからです。1280x720 の画素数は、1920x1080 の 4/9 しかありません。エンコーダが圧縮する画素がそれだけ減るので、縮小にかかる時間を足しても、全体では速くなります。「処理が1つ増えるぶん遅くなる」という感覚は、解像度を下げる場合には当てはまりません。

サイズが 52.3% 減ったのも同じ理由です。比べている相手は入力ファイルではなく、同じ素材を 1080p のまま再エンコードしたベースライン(86.26 MB)です。CRF 23 は一定の画質を保つ指定なので、画素が減れば、その画質に必要なデータ量も減ります。

解像度を変えるときは、-c copy(再エンコードせずにコピーする方法)は使えません。同じ環境で、ストリームをコピーするだけの操作(-map でのストリームの選び直しや moov atom の移動)は 0.41 秒と 0.49 秒で、どちらも1秒かかりませんでした。scale は必ず再エンコードになります。速くしたいときは、-preset や -crf を調整してください。それでも 18.43 秒は、再エンコードの中では軽いほうです。同じ素材で、boxblur は 59.37 秒、VP9 への変換は 729.16 秒かかりました。

計測コマンドは -an で音声を外しているので、41.14 MB は映像だけのサイズです。音声を残すと、そのぶん大きくなります。

よくある質問

height not divisible by 2 エラーが出る

-1 で計算した高さ(または幅)が奇数になると出るエラーです。-1 を -2 に変えてください。

ffmpeg -i input.mp4 -vf scale=1280:-2 output.mp4

拡大するとぼやける

scale フィルタの標準の拡大方法では、素材によっては少しぼやけて見えます。画質を上げたいときは -sws_flags lanczos を付けて、拡大の計算方法を lanczos に変えてください(冒頭の画像の右側が lanczos です)。

ffmpeg -i input.mp4 -vf scale=3840:-2 -sws_flags lanczos output.mp4

関連記事