最新のFFmpegでx264を使ってエンコードする

Pocket

とりあえず最新のFFmpegを使ってmpeg2-tsからmpeg2に変換するバッチファイルを作ることが出来たので,今度はx264を使用した変換にチャレンジします.必要なものは変換元の動画ファイルとffmpeg.exeのみ.ffmpeg.exeのダウンロードは[2013]新しいFFmpegを使ったらTS→MPEG2変換が高速になってた!をお読みください.また,ffmpegのオプションは以前とかなり違ってきています.現在のオプションは公式サイトのこちらをご覧ください.

Ads


ffmpeg.exeとlibx264を使用した変換方法

FFmpegではlibx264を使うことが出来ます.コマンドは「ffmpeg.exe -preset ***」というようにプリセットの値を入力します.

[libx264 @ 0229d380] Possible presets: ultrafast superfast veryfast faster fastmedium slow slower veryslow placebo [libx264 @ 0229d380] Possible tunes: film animation grain stillimage psnr ssim fastdecode zerolatency

コマンドを見ていたら上のようなメッセージが出てきてました.どうも,デフォルトで使えるpresetはultrafast superfast veryfast faster fastmedium slow slower veryslow placeboだけのようです.

今回テストに用いたのは2分50秒の地デジ番組(ファイル名test.tsMPEG2-TS,284MB).まずはslowプリセットで作成.

手持ちの古いffmpegについていたpresetの値(libx264-slow.ffpreset)を見たら,

coder=1 flags=+loop cmp=+chroma partitions=+parti8x8+parti4x4+partp8x8+partb8x8 me_method=umh subq=8 me_range=16 g=250 keyint_min=25 sc_threshold=40 i_qfactor=0.71 b_strategy=2 qcomp=0.6 qmin=10 qmax=51 qdiff=4 bf=3 refs=5 directpred=3 trellis=1 flags2=+bpyramid+mixed_refs+wpred+dct8x8+fastpskip wpredp=2 rc_lookahead=50

いました.ちなみにコマンドラインで入力したのはこんなコマンド.

ffmpeg -i test.ts -c:v libx264 -preset slow  test.mp4

ドラッグアンドドロップする場合には入力ファイルを%1,入力ファイルの拡張子より前を%~n1で表すので,

ffmpeg -i %1 -c:v libx264 -preset slow  %~n1.mp4

としておけばいいでしょう.平均のビットレートは2.2Mbps位で,fpsは16位.できあがったmp4は44.6MB.約16%に圧縮されました.2分50秒=170秒の動画をエンコードするのにかかった時間は5分32秒=332秒.ほぼ倍.

つぎに-threads 4を加えてみただけでテスト.かかった時間はほとんどかわらない.ファイルサイズもビットレートもほぼ同じ.-threads オプションはつけなくても自動でつくのかな.

今度は-preset medium.条件は一緒.

ffmpeg -i test.ts -c:v libx264 -preset medium  test.mp4

presetの値はこんな感じ.

coder=1 flags=+loop cmp=+chroma partitions=+parti8x8+parti4x4+partp8x8+partb8x8 me_method=hex subq=7 me_range=16 g=250 keyint_min=25 sc_threshold=40 i_qfactor=0.71 b_strategy=1 qcomp=0.6 qmin=10 qmax=51 qdiff=4 bf=3 refs=3 directpred=1 trellis=1 flags2=+bpyramid+mixed_refs+wpred+dct8x8+fastpskip wpredp=2

エンコードにかかった時間は4分16秒.ファイルサイズは44.7MBと同程度.

次はveryslow.試すまでもなくとんでもない時間がかかりましたので割愛.エンコード時間は21分18秒で平均ビットレートは1684kb/s.ファイルサイズも36.9MBと小さくなりました.

今回は何も指定していませんが,ビットレートやビデオの解像度,アスペクト比などは指定できます.例えば,ビットレート2Mbps,解像度1280×720,アスペクト比16:9でテレビ放送の29.97fpsにしたい場合には,

ffmpeg.exe -i test.ts -c:v libx264 -b:v 2000k -s 1280x720 -r 29.97 -aspect 16:9 -preset medium test.mp4

としてpresetを好きなものに指定すれば良いようです.今回はmediumでエンコードしたのですが実時間程度(2分44秒)で変換してくれました.ファイルサイズは43.5MB.

しかし,2passエンコードを試みるもエラーでffmpeg自体が落ちてしまいます.とりあえずx264に変換出来たからよしとするか.

tsからの2passエンコード

mpeg2-tsからx264でエンコードする場合,2passエンコードをすると2倍の時間がかかりますがよりきれいなものが出来るようです.
とはいえ,今のところ2013年版のffmpeg.exeではバッチで自動2passエンコードとまではいかないようです.
というのも,1回目と2回目で動画の時間が変わっているために2passエンコードできないのです.
しばらく悩みましたが,-tオプションで1回目の動画の時間数を指定してやることで2passエンコードできるようになりました.
次からffmpegを使った2passエンコードについてまとめます.

まずは1回目のエンコード.大切なのは-anオプションで音声無しというのと,-pass 1で1パス目を指定すること.

ffmpeg -i test.ts -c:v libx264 -an -pass 1  -preset slow  2passtest.mp4

上は入力ファイルtest.tsで出力ファイル2passtest.mp4になっています.もちろん-sで画面サイズを指定したり-aspectでアスペクト比を指定したりしても大丈夫.このとき,1pass目でのコマンドの中に最終的な動画の時間数が書いてあります.見るのはtime=00:02:49:80という時間.ffmpegに付属のffprobeで「ffprobe.exe ファイル名」を実行するとDurationの後に確認できます.

Ffmpeg_time2

これをメモしておいて2pass目のエンコードに入ります.

ffmpeg -i -y test.ts -c:v libx264  -pass 2 -b:v 1000k -preset slow  -t 00:02:49:80 2passtest.mp4

-yは上書きオプションで-b:vはビデオのビットレートをk単位で指定します.-tコマンドは動画の時間設定で,この場合は2分48秒80以上は保存しないという意味になります.1pass目と2pass目の時間数が異なると2passエンコードが出来ないので今回は時間数を見てから2pass目のエンコードを行います.

1pass目とほぼ同じ時間経過すると2pass目のエンコードが終了します.今回は2passtest.mp4というファイルを作成したので再生ソフトで2passtest.mp4を再生することができます.

バッチファイルで2passエンコードできればいいのにこのやり方だとむずかしいなぁ.