試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

FFmpegで映像のエンコード時に拡大/縮小を行う際のオプション指定について(バージョン0.6.1時点)

拡大/縮小時のサイズ指定

FFmpegで映像のエンコードを行う際、サイズを拡大もしくは縮小したい場合には-sオプションを用い、後ろにピクセル単位で「[幅]x[高さ]」を指定する。

$ ffmpeg -i [入力ファイル] -s [幅]x[高さ] (オプション...) [出力ファイル]

拡大/縮小の補間方式などの指定

拡大/縮小の処理はFFmpeg付属のlibswscaleというライブラリを用いて行われ、幾つかのパラメータ指定によりその挙動を調整することができる。ffmpegコマンドからは-sws_flags [フラグ文字列]の形で指定することになる。
例えば、拡大/縮小の補間方式はlibswscaleが提供する幾つかの方式の中から選択可能で、bilinear,lanczos,splineなどの値が指定できる。lanczosやsplineは高品質だがファイルサイズはbilinearやbicubicより大きくなる。
この他、libswscaleが行う処理についての幾つかのフラグが用意されており、例えば「print_info」を指定するとエンコード処理中に

[swscaler @ 0x2cf24a0]Bicubic spline scaler, from yuv420p to yuv420p using MMX2

のような形の情報を表示するようになる(上は「spline」指定の場合)。
フラグ文字列の一覧はヘルプから確認できるが、バージョン0.6.1の時点ではmanページには書かれていない。

$ ffmpeg --help
(中略)
SWScaler AVOptions:
-sws_flags         <flags> E.V.. scaler/cpu flags
   fast_bilinear           E.V.. fast bilinear
   bilinear                E.V.. bilinear
   bicubic                 E.V.. bicubic
   experimental            E.V.. experimental
   neighbor                E.V.. nearest neighbor
   area                    E.V.. averaging area
   bicublin                E.V.. luma bicubic, chroma bilinear
   gauss                   E.V.. gaussian
   sinc                    E.V.. sinc
   lanczos                 E.V.. lanczos
   spline                  E.V.. natural bicubic spline
   print_info              E.V.. print info
   accurate_rnd            E.V.. accurate rounding
   mmx                     E.V.. MMX SIMD acceleration
   mmx2                    E.V.. MMX2 SIMD acceleration
   3dnow                   E.V.. 3DNOW SIMD acceleration
   altivec                 E.V.. AltiVec SIMD acceleration
   bfin                    E.V.. Blackfin SIMD acceleration
   full_chroma_int         E.V.. full chroma interpolation
   full_chroma_inp         E.V.. full chroma input
   bitexact                E.V..

2つ以上のフラグを組み合わせる場合は「+」で区切る(例:「print_info+spline」)。

拡大/縮小の補間方式の既定値

-sws_flagsオプションなしでエンコードした場合に適用される拡大/縮小の補間方式は
[引用]ファイル名: ffmpeg-0.6.1/ffmpeg.c より

static unsigned int sws_flags = SWS_BICUBIC;

bicubic方式のようで、実際、同じ元ファイルを-sws_flagsオプションなしでエンコードしたものと-sws_flags bicubicオプションを付けてエンコードしたものはMD5などのダイジェストが一致した。
下のMD5は手元でテストしたファイルのものとなる。

$ ffmpeg -i [入力ファイル] -s [幅]x[高さ] (中略) noflags.avi
$ ffmpeg -i [入力ファイル] -s [幅]x[高さ] -sws_flags bicubic (中略) bicubic.avi
$ md5sum noflags.avi bicubic.avi
b1a2d0107b9d2e8c5044f64c1496ae12  noflags.avi
b1a2d0107b9d2e8c5044f64c1496ae12  bicubic.avi

関連記事:

使用したバージョン: