標準で使えるscale
フィルタの使い方。外部ライブラリにzscale
フィルタがありこちらはHDR、高品質リサイズ向けで処理速度はscale
フィルタより速くない。2022年3月4日のコミットで同程度に速くなった。
- 映像に余白を追加する pad
- 映像を指定座標に切り取る crop
- 比較する動画の解像度に合わせる scale2ref
- Zライブラリを使ったリサイズフィルタ zscale
- 映像を拡大するアップコンバートフィルタのまとめ
基本コマンド
アスペクト比を維持しながら横幅1280ピクセルにリサイズする。
ffmpeg -i input -vf scale=1280:-1 output
さらに縦幅が奇数になる場合には繰り上げて偶数にする。
ffmpeg -i input -vf scale=1280:-2 output
アスペクト比を維持しながら長辺1280ピクセルより大きいとき長辺1280ピクセルにリサイズする。小さければそのまま。
ffmpeg -i input -vf "scale=if(gte(iw\,ih)\,min(1280\,iw)\,-2):if(lt(iw\,ih)\,min(1280\,ih)\,-2)" output
アスペクト比を維持して最大横幅が1280ピクセル、縦幅が720ピクセルまで。
ffmpeg -i input -vf "scale=1280x720:force_original_aspect_ratio=decrease" output
リサイズ方法をlanczosに変える。
ffmpeg -i input -vf scale=1280:-2:flags=lanczos output
ffmpeg -i input -vf scale=1280:-2 -sws_flags lanczos output
lanczosにaccurate_rndを併用する。
ffmpeg -i input -vf scale=1280:-2 -sws_flags lanczos+accurate_rnd output
ガンマ補正を行う。既定値では行わない。
ffmpeg -i input -vf scale=1280:-2 -gamma 1 output
横幅が1280ピクセル未満はリサイズせずに、超えたら横幅1280ピクセルをアスペクト比に合わせて縦幅をリサイズする。
ffmpeg -i input -vf scale=min(1280\,iw):min(-2\,ih) output
解像度1920×1080以下はリサイズせずに、超えた分のアスペクト比の大きい方に合わせて1920×1080に収まるようにリサイズする。
ffmpeg -i input -vf scale=iw*min(1920/iw\,1080/ih):ih*min(1920/iw\,1080/ih) output
sarとdarが通常のではなく、出力時に指定したdarと縦幅でリサイズする。例は16:9で縦幅720ピクセルに横幅を自動に合わせる。16:9なので横幅は1280ピクセルになる。
ffmpeg -i input -vf setsar=1,setdar=dar=16/9,scale=(dar*oh):720 output
evalの利用例。出力解像度は変更できないので複数の映像を合わせる。例えばoverlay
フィルタなどで使える。
ffmpeg -i input1 -i input2 -filter_complex [1:v]scale=-1:ih-100*t:eval=frame[top];[0:v][top]overlay=x=100:y=100:shortest=1 output
上の例だとoverlay
フィルタの指定座標に向かってリサイズする。2入力目の映像の中心に向かってリサイズするにはoverlay
フィルタの座標も動的に変更する。これを一度に行うのがzoompan
フィルタだがまだ記事を書いていない。
ffmpeg -i input1 -i input2 -filter_complex [1:v]scale=-1:ih-100*t:eval=frame[top];[0:v][top]overlay=x=100+100*t:y=100+100*t:shortest=1 output
video – ffmpeg: How to scale .png over time – Super User
animation – ffmpeg scale down video dynamically (squeeze-back) or zoompan out to smaller than original – Stack Overflow
yuvjのついたフルレンジピクセルフォーマットにHEVCは対応しているが、AVC、jpeg2000、AV1等は対応してないので出力カラーレンジにリミテッドレンジをつける。AVCのx264(libx264)は対応している、
フルレンジからリミテッドレンジに変換したAVC。
ffmpeg -i yuvj_input -c:v libx264 -c:a copy -pix_fmt yuv420p -color_range tv output
BGR(RGBではない)からYUVに変換するときはscale
フィルタのフラグにaccurate_rndをつける。
ffmpeg -i bgr_input -vf scale=flags=accurate_rnd -c:a copy output
インターレース保持しながらリサイズ。
ffmpeg -i input.ts -vf scale=-2:720:interl=1 -c:v libx264 -flags +global_header+ilme+ildct -weightp 0 -c:a aac output.mp4
- ffmpeg_libx264.md
- ffmpeg -h encoder=h264_nvenc
- 忘備録 tsをh264へエンコード(ffmpeg、インタレ保持)
- ffmpegでMPEG2-TSファイルをmp4に変換する – k_piの雑記帳
ffmpeg 7.2からはHDRからSDRへの変換時のトーンマッピングがlibplacebo
フィルタを参考に実装されてできるようになる予定。out_chroma_loc=leftがSDR向けに指定されるのがポイント。-color_primaries bt709 -color_trc bt709 -colorspace bt709はscale
フィルタで指定されているので不要。
ffmpeg -i hdrvideo -vf scale=w=1920:h=1080:out_chroma_loc=left:out_color_matrix=bt709:out_primaries=bt709:out_transfer=bt709:intent=relative_colorimetric,format=yuv420p output
ffmpegのwiki:Scaling – FFmpeg
公式ドキュメント:FFmpeg Filters Documentation : scale
オプション
- width, w[string]
出力解像度の横幅。0は入力と同じ。-1はアスペクト比を揃えて縦解像度に合わせる。-nでnの倍数で割りきれるように繰り上げて調整する - height, h[string]
出力解像度の縦幅。0は入力と同じ。-1はアスペクト比を揃えて横解像度に合わせる。-nでnの倍数で割りきれるように繰り上げて調整する - size, s[string]
横幅x縦幅。使える書式 - flags[string]
リサイズアルゴリズムの指定。+をつけて複数指定できる。設定値は後述 - interl[boolean]インターレース保持指定。実際に保持できるかどうかはエンコーダ次第。libx264は保持できるが別途パラメータが必要。ほかにもmpeg2video、h264_nvenc(Turing以前)などがある。
- 0:保持しない。既定値
- 1:保持する
- in_color_matrix[string]入力カラーマトリクス
- auto:既定値
- bt601
- bt470
- smpte170m
- bt709
- fcc
- smpte240m
- bt2020
- out_color_matrix[string]
出力カラーマトリクス
設定値はin_color_matrixと同じ - in_range[int]入力カラーレンジ
- 0, auto, unknown:既定値
- 1, mpeg, limited, tv
- 2, jpeg, full, pc
- out_range[int]
出力カラーレンジ。設定値はin_rangeと同じ - in_chroma_loc[int]入力クロマロケーション
- 0, auto, unknown:既定値
- 1. left
- 2, center
- 3, topleft
- 4, top
- 5, bottomleft
- 6, bottom
- out_chroma_loc[int]
出力クロマロケーション。設定値はin_chroma_locと同じ - in_primaries[int]入力カラープライマリー
- -1, auto:既定値
- 1, bt709
- 4, bt470m
- 5, bt470bg
- 6, smpte170m
- 7, smpte240m
- 8, film
- 9, bt2020
- 10, smpte428
- 11, smpte431
- 12, smpte432
- 22, jedec-p22, ebu3213
- out_primaries[int]
出力カラープライマリー。設定値はin_primariesと同じ - in_transfer[int]入力トランスファー
- -1, auto:既定値
- 1, bt709
- 4, bt470m, gamma22
- 5, bt470bg, gamma28
- 6, smpte170m
- 7, smpte240m
- 8, linear
- 11, iec61966-2-4, xvycc
- 12, bt1361e
- 13, iec61966-2-1, srgb
- 14, bt2020-10
- 15, bt2020-12
- 16, smpte2084:PQ (Perceptual Quantization)
- 18, arib-std-b67:HLG (Hybrid Log-Gamma)
- out_transfer[int]
出力トランスファー。設定値はin_transferと同じ - in_v_chr_pos[int]
縦方向の入力クロマポジション
既定値:-513(無指定扱い)
範囲:-513から512まで - in_h_chr_pos[int]
横方向の入力クロマポジション
既定値:-513(無指定扱い)
範囲:-513から512まで - out_v_chr_pos[int]
縦方向の出力クロマポジション。out_h_chr_pos=0:out_v_chr_pos=128でchroma_sample_loc_type=0のleft。out_h_chr_pos=0:out_v_chr_pos=0でchroma_sample_loc_type=2のtop leftになる
既定値:-513(無指定扱い)
範囲:-513から512まで - out_h_chr_pos[int]
横方向の出力クロマポジション
既定値:-513(無指定扱い)
範囲:-513から512まで - force_original_aspect_ratio[int]
scale
フィルタの縦横(w, h)どちらに合わせアスペクト比(DAR)維持してリサイズするか- 0, disable:無効。既定値
- 1, decrease:短い方に合わせる
- 2, increase:長い方に合わせる
- force_divisible_by[int]
force_original_aspect_ratioと併用することでforce_divisible_byの値に最も近い許容倍数に丸める
既定値:1
範囲:1から256まで - param0, param1[double]
lanczosで使う。reddit
bicubicでも使える。reddit、Wikipedia nb_slices[int]
スライス数の指定。デバグ目的で利用。削除された
既定値:0- eval[int]リサイズの評価方法
- 0, init:1フレーム目で固定。既定値
- 1, frame:フレーム毎に変動
縦横幅に使える書式
これも使える。ffmpeg で使える評価式
- in_w, iw:入力横幅
- in_h, ih:入力縦幅
- out_w, ow:横幅(width, w)で指定した値。縦幅の指定に横幅でリサイズした後の値を使うときに使う
- out_h, oh:縦幅(height, h)で指定した値。横幅の指定に縦幅でリサイズした後の値を使うときに使う
- a:iw / ih
- sar:サンプルアスペクト比
- dar:(iw / ih) * sar
- hsub, vsub:入力クロマサブサンプル値。yuv422pだと hsubは2、vsubは1
- ohsub, ovsub:出力クロマサブサンプル値。yuv422pだと hsubは2、vsubは1
evalに使える書式
- n
0から始まるフレーム番号 - t
タイムスタンプ秒 - pos
デコード時点での合計ファイルサイズ
SWScalerオプション
公式ドキュメント:FFmpeg Scaler Documentation
リサイズアルゴリズム
-sws_flagsからアルゴリズムを指定できる。-sでのリサイズと、-vfのscale
フィルタでflagsを指定しないとbicubicが使われるが、-filter_complexのscale
フィルタでflagsを指定しないとbilinearが使われてアルゴリズムが異なる。この仕様は2021年8月5日のコミット、バージョンでは4.4以降で直り、無指定でbicubicが使われるようになった。
- fast_bilinear
- bilinear
- bicubic
- experimental
- neighbor
- area
- bicublin
- gauss
- sinc
- lanczos
- spline
- print_info
- accurate_rnd
- full_chroma_int
- full_chroma_inp
- bitexact
- error_diffusion
ディザーアルゴリズム
-sws_ditherからアルゴリズムを指定できる。
- 0, none
- 1, auto:swsから児童に選ばれる。既定値
- 2, bayer
- 3, ed:error diffusion
- 4, a_dither:arithmetic addition dither
- 5, x_dither:arithmetic xor dither
そのほかの抜粋
- -gamma[boolean]
ガンマ正しくリサイズする
既定値:0 - -alphablend[int]アルファ付きからなしのモード
- 0, none:アルファを無視する。既定値
- 1, uniform_color:ユニフォームカラーにブレンド
- 2, checkerboard:チェックカーボードにブレンド
- -threads[int]
利用スレッド数
既定値:0, auto - -intent[int]異なる色空間の間で変換するときに使用するICCレンダリングの意図
- 0, perceptual:最終的に出力する画像や動画向け
- 1, relative_colorimetric:既定値。クリップしてでも忠実に再現する
- 2, saturation:彩度マッピングする
- 3, absolute_colorimetric:ホワイトポイントやブラックポイントの再現をせず色域外の色をハードクリップする
-intentのメモ
BS4KのHLGからSDR変換で検証した結果
- perceptualはSDRのより輝度が落ちる
- saturationはSDRのより大きく輝度が落ちる
- relative_colorimetric、absolute_colorimetricは見た目かなり似てSDRに近い
[…] リサイズする scale | ニコラボ […]
出力カラーレンジにリミテッドレンジをつけるのならscale=out_range=pcではなくscale=out_range=tvなのでは?
指摘ありがとうございます。記事を修正しました。
> yuvjのついたフルレンジピクセルフォーマットにHEVCは対応しているが、AVC、jpeg2000、AV1等は対応してない
これは知りませんでした。H.264に変換しようとしていましたが、H.265にします。
いつからこの記述になっているか記憶があいまいですが、AVCは未対応ではなく、x264(libx264)は対応しています。なので訂正しました。