ffmpeg で TS をできるだけ高画質な mp4 へ変換してみた
TS が膨大になる前に、残したいものだけをできるだけ高画質な mp4 にエンコードしてみることにしました。
- 2017-03-19 追記:地味に更新 :D 現在最新安定版FFmpeg v3.2.4に合わせた手元のlibx264-hq-ts.ffpresetを公開しました。libx265のプリセットの話とか、FFmpeg v3.2(だったかな)から入ったいわゆるヌルヌル化するminterpolateフィルタの話 FFmpeg Filters Documentation とかも楽しいですね!
- 2012-04-XX 追記:libx264-hq-ts.ffpreset の設定項目の解説を加筆中。とりあえず、level=41 からカキカキしています。
- 2011-04-22 tsをh264へエンコード(ffmpeg、インタレ保持) - 忘備録 Written by ふくたん. さんところで、インタレース保持について言及がありました。確かに、インタレについては、ふくたんさんところで書かれているとおり、リサイズができなくなるんですよね (^^;; See FFmpeg-users Resize and Interlace doesnt work http://ffmpeg-users.933282.n4.nabble.com/Resize-and-Interlace-doesnt-work-td2284403.html
- 2010-08-XX 追記:なぜかこのページに多数のサイトさまからご紹介いただいているようで恐縮です m(_ _)m せっかくですので、ちょっと説明を加筆中 ... でございます。今ですと、iPad/iPhone 向けに libx264-hq-ts.ffpreset を使えば、ウマー(^o^)/ な感じですヨ。
- 2009-12-29 追記:プリセットとスクリプトをちょこっと修正。
TS エンコーディング用の x264 プリセットを作ってみる
FFmpegが更新されるごとに、手元のlibx264-hq-ts.ffpresetをちまちま更新してきました。
現時点で最新版のFFmpeg v3.2.4に合わせた手元のlibx264-hq-ts.ffpresetを公開いたします。
level=41 crf=25 coder=1 flags=+loop 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 qmin=10 rc_eq='blurCplx^(1-qComp)' bf=16 bidir_refine=1 refs=16 deblock=0:0
FFmpeg v3.2.4の頃とv1.0未満の頃とのlibx264-hq-ts.ffpresetの差分
--- libx264-hq-ts.ffpreset~ 2017-03-19 10:47:38.000000000 +0900 +++ libx264-hq-ts.ffpreset 2017-03-19 10:47:07.000000000 +0900 @@ -2,20 +2,18 @@ level=41 crf=25 coder=1 flags=+loop -cmp=+chroma partitions=+parti8x8+parti4x4+partp8x8+partb8x8 me_method=umh -subq=7 +subq=8 me_range=16 g=250 keyint_min=25 sc_threshold=40 i_qfactor=0.71 -b_strategy=1 +b_strategy=2 qmin=10 rc_eq='blurCplx^(1-qComp)' bf=16 bidir_refine=1 -refs=6 -deblockalpha=0 -deblockbeta=0 +refs=16 +deblock=0:0
[履歴:これは古いです!]FFmpeg v1.0 未満ぐらいのときのlibx264-hq-ts.ffpreset
ffmpeg に同梱されている libx264-hq.ffpreset がイケています。こいつをベースにして、ffmpeg のヘルプを見ながら、参考文献の先人の皆様の知恵を拝借しつつ、TS 用のプリセットファイル libx264-hq-ts.ffpreset*1 を作ってみました。
level=41 crf=25 coder=1 flags=+loop cmp=+chroma partitions=+parti8x8+parti4x4+partp8x8+partb8x8 me_method=umh subq=7 me_range=16 g=250 keyint_min=25 sc_threshold=40 i_qfactor=0.71 b_strategy=1 qmin=10 rc_eq='blurCplx^(1-qComp)' bf=16 bidir_refine=1 refs=6 deblockalpha=0 deblockbeta=0
ちなみに、このプリセットには、-crf 25 というシングルパス用の品質基準 VBR を入れているので、マルチパス向けではありません。
拙作 libx264-hq-ts.ffpreset とオリジナル libx264-hq.ffpreset の違い
$ diff -up libx264-hq.ffpreset libx264-hq-ts.ffpreset --- libx264-hq.ffpreset 2010-07-17 16:16:11.000000000 +0900 +++ libx264-hq-ts.ffpreset 2009-12-29 11:02:08.000000000 +0900 @@ -1,22 +1,21 @@ +level=41 +crf=25 coder=1 flags=+loop cmp=+chroma partitions=+parti8x8+parti4x4+partp8x8+partb8x8 me_method=umh -subq=8 +subq=7 me_range=16 g=250 keyint_min=25 sc_threshold=40 i_qfactor=0.71 -b_strategy=2 -qcomp=0.6 +b_strategy=1 qmin=10 -qmax=51 -qdiff=4 -bf=3 -refs=4 -directpred=3 -trellis=1 -flags2=+wpred+mixed_refs+dct8x8+fastpskip -wpredp=2 +rc_eq='blurCplx^(1-qComp)' +bf=16 +bidir_refine=1 +refs=6 +deblockalpha=0 +deblockbeta=0
とりあえず、極々簡単な TS 変換用スクリプトを書いてみる
[追記]最低限、現時点で最新安定版FFmpeg v3.2.4で動くように更新。libfaacからlibfdk_aacへ変更、-vpreから-fpreへ変更、-vsync 1を追加しました。
簡単な TS 変換用スクリプト ts2mp4.sh を書きます。
#!/bin/bash -x TS=$1 BASE=$(basename $TS .ts) [ "${BASE}.ts" = "$(basename $TS)" ] || exit 1 #CPU_CORES=0 CPU_CORES=$(/usr/bin/getconf _NPROCESSORS_ONLN) X264_HIGH_HDTV="-threads ${CPU_CORES} \ -fpre /some/where/ffmpeg/libx264-hq-ts.ffpreset \ -vcodec libx264 -acodec libfdk_aac -ar 48000 -ab 128k \ -r 30000/1001 -s 1280x720 -vsync 1 -deinterlace \ -f mp4 -bufsize 20000k -maxrate 25000k" ffmpeg -y -i $TS ${X264_HIGH_HDTV} ${BASE}.mp4 exit
これでエンコードされたファイル容量は割と大きいので、必要であれば、手持ちのハードディスクと自己満足感と相談して、-aspect 16:9 -s 1280x720 を -s 640x480 などに変更すればよいです。
あと、2 pass encoding にも挑戦しましたが、エンコにめっちゃ時間がかかるのと、私の納得のいく画質を保つことが出来なかったので、今回はスルーです。
エンコは奥が深いなとしみじみと感じるひとときを過ごしました。一度でイイから、エンコ職人のプリセットを見てみたい(w
参考文献
*1:2009/12/27 時点でできたてほやほやです。しばらくしたら、改良している可能大なので、あくまで目安としてくださいませ。例えば、-qmin や -qmax を入れるとか。