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
level=41

これは、H.264 のプロファイルのレベルが 4.1 に指定しています。

H.264 のプロファイルとは、簡単にいうと用途別に機能を定義した仕様です。各レベルごとに、おもに解像度とビットレートに影響する、``ある種の制限'' が設けられています。ケータイ電話やスマートフォンiPhoneiPad などの周辺機器が、どのレベルに対応しているかで、再生できたりできなかったりします。

http://ja.wikipedia.org/wiki/H.264 には、H.264 のプロファイルのレベルが一覧表にまとめられています。

とりあえず、極々簡単な 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 を入れるとか。