H.264+AACなMP4について調べだしてから1ヶ月分のまとめです。
といっても毎日毎日勉強していたわけではなく色んなパターンを試した程度に過ぎないのでたいしたことはありません。結論を言ってしまうとx264以外の他コーデックは当分使う気が起きなくなりました。といいつつDivX+MP3のAVI利用者がこれほどまでに多いのは、一時期あった爆発的なDivXブームによる普及、エンコードの手軽さ、ほとんどの人が再生できる環境にあることだと思っています。H.264+AACなMP4を人に見せたいときffdshowを入れてオーバーレイのアスペクト比設定にチェックを入れて出来ればHaaliMediaSplitterを入れてほしい・・・と説明しだすのは中々難しいですしねw まぁ万人向けでVFR+複数音声をやりたいならWMVという感じですが。
そんなことを考えつつも他コーデックを使う気が起きなくなったポイントなんかをズラズラ書き綴って行きます。
圧縮効率がx264は異様に高い。特にアニメは縮む。
見出しのことはよく言われてることですが大体どの程度縮むのかというのはあまり見かけません。なのでどの程度縮むかのを比較するためにDivX(DivX Pro)でエンコードしたものと、デフォルト設定に近いx264と、Bフレームを使用したx264を3つの5パターンを紹介していこうと思います。ついでに他のソースでも色々やっていきます。
ひぐ○しの○く頃に解 2話 24:27 24fps(EDに一部30混合無視)
ここでx264のCRF20はDivXの品質保持2.4とイコールの関係で比較していいのかと突っ込まれると厳しいのですが、今回のソースではむしろcrf20と変わりませんでした(むしろcrf20のが綺麗)。厳しい人は恐らく品質指定じゃなくてレート指定2パス以上と言われるでしょうがお手軽品質指定で比較したときの話ですので。
・DivX品質保持2.4 → 164M 平均ビットレート 939Kbps
・x264 crf20 Bフレーム無 → 149M Average bitrate 833 kbps - Max Bitrate 4449 kbps
・x264 crf20 --bframes 4 → 100M Average bitrate 556 kbps - Max Bitrate 3033 kbps
・x264 crf20 --bframes 1 → 126M Average bitrate 706 kbps - Max Bitrate 3245 kbps
・x264 crf20 --bframes 16+ → 71.1M Average bitrate 395 kbps - Max Bitrate 2692 kbps
最大の争点はBフレームの枚数であって、Bフレーム無しのソースと--bframes 4を比較すると若干--bframes 4のが汚いような気がします(気がするだけ)が同等として扱っています。Bフレーム無しと--bframes 1については何が変わったのかまったくわかりませんがサイズだけ縮んでしまうという恐ろしさです。そんな云々より実際見た目どうだったんだと言われると、100Mのx264 crf20 --bframes 4で全然良いじゃんという具合でした。
更にx264 rev10スレの144さんの設定を拝借してscenecutとqpstepの数値をいじったものを試してた結果が--bframes 16+の71.1Mです。エンコードしている本人が見ても何が変わったのかわからないまま再びサイズが下がりましたwエンコード時間は1.5~2倍ぐらい増えた気がします。恐らくmerangeとtrellisと--partitions allがガンガンエンコード時間を延ばしているんだと思います。DivXのソースと比較すると90Mも軽くなりましたがこのソースに限ってぱっと見で違いがわかりません。よーく見てみるとところどころ暗い部分や動きで劣化しているようにみえますがその一点に注目して意識してないとわからないレベルでした。ちなみに当倍での比較ではなく私の液晶解像度の限界の1280*720のフルスクリーンに拡大して見ている話をしています。
・Bフレーム無しの設定
--crf 20 --level 4 --keyint 240 --min-keyint 1 --scenecut 60 --ref 3 --analyse p8x8,b8x8,i4x4 --qpmax 40 --qpstep 6 --subme 6 --threads auto --thread-input --progress --sar 40:33 --no-dct-decimate --no-psnr --no-ssim・Bフレーム1枚の設定 (--bframes 1)
--crf 20 --level 4 --keyint 240 --min-keyint 1 --scenecut 60 --bframes 1 --bime --b-rdo --weightb --direct auto --analyse p8x8,b8x8,i4x4 --qpmax 40 --qpstep 6 --ipratio 1.70 --pbratio 1.50 --subme 6 --no-fast-pskip --threads auto --thread-input --progress --sar 40:33 --no-dct-decimate --no-psnr --no-ssim・Bフレーム4枚の設定 (--bframes 4)
--crf 20 --level 4 --keyint 240 --min-keyint 1 --scenecut 60 --bframes 4 --bime --b-rdo --b-pyramid --weightb --direct auto --analyse p8x8,b8x8,i4x4 --qpmax 40 --qpstep 6 --ipratio 1.70 --pbratio 1.50 --subme 6 --no-fast-pskip --threads auto --thread-input --progress --sar 40:33 --no-dct-decimate --no-psnr --no-ssim・x264スレにあったBフレーム大好きな人の設定を拝借 (--bframes 16+)
--crf 20 --level 4 --keyint 240 --min-keyint 1 --scenecut 60 --bframes 16 --b-bias 100 --b-pyramid --ref 6 --deblock 3:3 --ratetol 4 --qpstep 6 --partitions all --ipratio 1.70 --pbratio 1.50 --me umh --merange 32 --subme 7 --mixed-refs --bime --b-rdo --weightb --direct auto --8x8dct --trellis 2 --sar 40:33 --no-dct-decimate --cqm jvt --no-psnr --no-ssim
画質重視にする場合の(一応の設定)
汚いよエビフにゃイ!と言われたので置いておきます(2007/11/1)。crf18ぐらいにしても激しいものでなければSDサイズであれば200~250Mぐらいで済みますしね。動かないのならそれでも150Mになったりするかもしれませんし。私のはSharktooth版のx264ではないので--aq-strength, --aq-sensitivityは使用出来ません。あとはマトリクスをjvt派生のものをDoom9で拾うかソース用に作ればOKですかね。それに関連するオプションも追記で。ある程度憶測で数値を入力していくことが出来ますが試して変えてを繰り返して大変な作業だと思います。--me esaで徹底サーチさせるのもいいんですがこれ以上遅くなるとどうなんだろうというところで指定無しのhexになっています。HDソースでcrf18にすると強烈なサイズになってしまうので大体20でやっています。
・SDソース1 安定
--crf 18 --level 4 --keyint 240 --min-keyint 1 --scenecut 60~75 --bframes 1 --bime --b-rdo --weightb --direct auto --analyse p8x8,b8x8,i4x4 --qpmax 40 --qpstep 6~8 --ipratio 1.70 --pbratio 1.50 --subme 6 --no-deblock --no-fast-pskip --threads auto --thread-input --progress --sar 40:33 --no-dct-decimate --no-psnr --no-ssim・SDソース2 bframesもっと使いたい
--crf 18 --level 4 --keyint 240 --min-keyint 1 --scenecut 60~75 --bframes 2~4(推奨3) --bime --b-rdo --b-pyramid --weightb --direct auto --analyse p8x8,b8x8,i4x4 --qpmax 40 --qpstep 6~8 --ipratio 1.70 --pbratio 1.50 --subme 7 --no-deblock --no-fast-pskip --threads auto --thread-input --progress --sar 40:33 --no-dct-decimate --no-psnr --no-ssim・HDソース
--crf 20~22 --level 4~4.2 --keyint 240 --min-keyint 1 --scenecut 60~75 --bframes 2~4 --bime --b-rdo --b-pyramid --weightb --direct auto --analyse p8x8,b8x8,i4x4 --qpmax 40 --qpstep 8 --ipratio 1.70 --pbratio 1.50 --subme 7 --no-deblock --no-fast-pskip --threads auto --thread-input --progress --sar 40:33 --no-dct-decimate --no-psnr --no-ssim
魔法○女リリカル○のはStrikerS 1~6話でのケース
別のソースで、ひぐ○しとは比較にならないほど動き回る魔法○女リリカル○のはStrikerSでは面白い結果が出ました。使ってるフィルタがお互い違うんですけど少しは参考になると思います。DivX 品質保持3の120fpsでいつもやっていたのですが、x264のBフレーム4枚でVFRなMP4で比較するとこんな結果になりました(音声込みDivX=MP3 CBR 128K、x264=AAC VBR 128K)。左がDivXで右がx264です。
1話 295M 272M 2話 236M 227M 3話 248M 225M
4話 258M 227M 5話 446M 349M 6話 253M 218M
大体が20~30Mしか変わっていませんが、画質は圧倒的にcrf20のx264のほうが綺麗に仕上がっています。5話だけ比較して何故か100M近く軽くなりました。5話は全員ヘシーン、バトル満載の大変な回なので品質を保持しようとお互いエンコーダーが頑張ってビットレートを割いてるのがよくわかりますね。x264の設定はscenecutが75でqpstep10なの以外はひぐ○しとほとんど同じです。
ハードディスクが安くなりファイルサイズに気を使わなくて済むようになった現在では比較して50M程度変わったぐらいではフーンの一言で片付けてしまうのですが綺麗ということであれば話は別です・・・。容量的にはDivX品質保持3=x264 crf20ですが画質的にはDivX品質保持2=x264 crf20になってしまう勢いだと思っています。なのでこの比較ではファイルサイズを注目するのではなく、画質がよくなった上にファイルサイズも軽くなったと考えて下さい。もちろんx264のオプションによってこの差が広がったり縮まったりするのでしょうが。少し話が変わりますがファイルサイズに気を使わなくて済むようになったといいつつアニメのSDソースで400M以上とかどうなのよ?とは思っています。良アプコンな放送媒体の1280×720、綺麗なSDをPS3アプコンで1280×720とかなら理解できるのですけどね。
ちなみに100M差以上開いた5話をBフレーム万歳なオプションでエンコードすると282Mでした(映像のみは257M)。さすがにこればっかりは見た目はっきり違いがでました。影に隠れている場所でアップや動きがある場合、画面が揺れてるような髪のなびきかたや光が高速で揺れている場合などは、汚くなっているとはっきりわかります。要するに何でもBフレーム万歳しているのではダメな場合があると言いたいのです。ですが--bframes の枚数や-b-biasの数値を調節していってどこが妥協点なのか探ると面白いかもしれませんね。というか5話は本当にいかれているほど動き回ったりする回なんで特別なんです。
他シーンで灰色の地下道のような暗いシーンで発光したり動きまわるケースがあるのでbframesの扱いは特に注意がいると思います。出来れば4と1の両方ためしてソースを両方見て決めるべきだとは思います。ベタではない暗い壁などがパンで流れたりその周りで動かれるとさすがに違いが見るレベルでわかると思います。
以下は画面にうつる全てのものを対象に画質優先をする人や、SDサイズのアニメで400Mぐらい割くほどの画質優先をする人のケースの話です。bframesなんか使わなければいいじゃんという人は実際にいます。色々設定を試し抜いた結果ソースによっては劣化がひどく見えるものとそうでないものが出てきて同じ設定の使いまわしでは不安がでてくるからです。もちろんbframesを使用していない場合でも他コーデックと比較してファイルサイズは縮みますし綺麗に仕上がりますので、bramesを使用しないでx264を使う人がいるのも納得は出来ます。人によってはbramesを使わない上にcrf17ぐらいまで下げてエンコードする人もいるわけです。私の考えですが、せっかくx264を使っているのですから--bframes 1 --bime --weightbぐらいは使っておきたいですね。
劇○版○眼のシ○ナのD○Dでのケース
更に別のソースで劇○版○眼のシ○ナのD○Dをやりました。音声がDDで3トラックある上にメインは5.1chです。以前にVFRに挑戦の記事の冒頭で書きましたが複数トラックをどうするか困っていたとはこういうケースのことです。以下MP4の構成ですがこれにチャプターファイル合わせて758Mです。
映像 : 612M 01:26:19.966 Pixel Aspect Ratio 40:33 Indicated track size 704 x 480Decoding Buffer size 107218 Average bitrate 966 kbps - Max Bitrate 6566 kbps
音声1 : 75.8M Average bitrate 119 kbps - Max Bitrate 164 kbps
音声2 : 34.3M Average bitrate 53 kbps - Max Bitrate 85 kbps
音声3 : 35.6M Average bitrate 55 kbps - Max Bitrate 71 kbp
平均ビットレート1Mを下回るとは予想外でした。その割には1280*720に拡大して見てもそこそこ綺麗です。通常アップ、暗いアップ、ごちゃごちゃしているシーン、背景のシーン、とこんな感じです。オーバーレイオフでとったSSなことを注意して見てください。ちなみに動いてる部分でブロックノイズの発生はほとんどわかりません。輪郭のシャープきついねと言われると思いますがこれは私の好みです。ジャギる寸前(実際はジャギってるようにしかみえないw)ぐらいまでかけます。正直このソースにはかけすぎたと後悔しています\(^o^)/本当は背景を潰さないようにWavret2DNRでノイズ除去しようとしましたが、面倒なので標準ノイズ除去少しきつめで消したので背景潰れてると思います。
むしろ注目してほしいのは音声2、3についてでHE-AACでABR 52K指定にしています。おかげで1時間26分あっても35Mですよ!中身はオーディオコメンタリーでボイスがメインなのでむしろもう少しさげても差し障りなかったかもしれません。MP3の時のビットレート指定が頭にあってどうしても下げるのが怖くなってしまうんですよねw
このソースに関してはH.264+AACなMP4をやりはじめて一番報われた!と思った瞬間でした。欲を言えば音声全部DDのAC3のままにしておきたかったのですが、5.1chなんてまともに再生できる人が少なくてH.264+AACなMP4コンテナよりもっとタチが悪いかもしれないと思ってやめました。ノーマライズしてビットレートも下げたい場合には、一旦全部各チャンネルをWAVに吐いてNRをかけてBeSweetでMUXしてビットレート下げたAC3に吐くとかそういうことする必要があるんですかね?まだ未着手なのであまりどうのこうの言えません\(^o^)/
1ヶ月ではx264についてよくわかっていないけど結論
一般常識で普通に考えられている「ファイルサイズが大きければ画質もいいに違いない」という法則はx264についてはかなり崩れます。DivXで300Mのx264で200Mのどちらが綺麗?という場合練りに練ったx264のが上回る可能性が高いからです。
ビットレート指定2PASSでエンコードした場合レートを割きたい部分に余った部分が割り当てにいく余裕が増えるので同じファイルサイズだけど全然こっちのが綺麗!というのもあると思います。ですがそれはデフォルト設定で微妙にレートが足りていないものと比べたときの話なので、綺麗になるように使うだけではなく綺麗なものを維持しつつファイルサイズを下げるやり方が相応しい気がします。まぁそれは言うまでもなく当たり前のことなんでしょうけどw 要するにいかにして圧縮率を上げきることができるかという一点につきますね。
このようにx264は元ソースや使用するオプションによってはっきりわかるほど差がでてしまうことがこの1ヶ月でよくわかりました。
現時点の結論を言ってしまうと、ある一定の画質を保持しつつファイルサイズを気にしない人にはそこまで無理にx264を使うメリットは無いのかもしれません。噛み砕いてわかりやすい例で言いますと、従来のDivX(DivXPro)やWMVで300Mだったのがx264で200Mに変わったということについて「私にとってそれは些細なことだよ」という人には使う価値はなくなってしまいます。1ファイル100Mの差が100ファイルあるとすると10Gの差になるわけで私にとっては価値があるものになります。ここで言う「ある一定の画質」と「許容される(求める)ファイルサイズ」は人によって違うのです。要するにある一定の画質に到達するのがx264、DivX、WMVを比較したときに、より小さいファイルサイズでx264は到達することが出来るわけです。それをどう捉えるかは人によって違うでしょう。
更に「エンコードにかかる時間(手間)」というのがここに付加されることによって更に話が膨らみます。少しx264の話と逸れますが、2PASSしたほうが綺麗、2Dノイズ輝度ノイズはWavretを使う、ワープシャープとアンシャープマスクの併用をするなど言い出すと洒落にならないことになります。重いフィルタを使用して2PASSすることが前提ですとそれぞれ重いフィルタをかけた中間をhuffyuv出力をした後にx264で2PASSをするほうが速いですかね。ついでにx264のエンコード時間がモリモリ増えるオプションも満載にするといくら中間でhuffyuvで出力したものを単純に2PASSするだけでも結構な時間がかかると思います。最終的に24分のアニメが合計で10時間かかるんだが!という事態を招きます。複数台PCを持っていて時間を気にしない人にとっては些細なことになるのかもしれません。その手間が見合うものなのかどうかは人によって大きく違うでしょう。私はx264は品質指定のcrfで十分だと思います。特定のファイルサイズを狙ってやるなら別ですけどね。
「ある一定の画質」と「許容される(求める)ファイルサイズ」と「エンコードにかかる時間(手間)」という3つの要素が絡んでしまうと大変なことになってしまうのです。x264の話からどんどん逸れていきますが、それを考えずに「エンコの最高の設定を教えてくれよ^ω^エビフにゃイ」という質問は愚かなことが理解いただけたでしょうか。最高ってなんだよ!と突っ込みたくなってしまうわけです。ではどこが妥協点なのかというところが私にとっては大切です。じゃあまずTV局か製作会社からHDCAMを貰ってくるところからはじめようか・・・。
オマケ
私がMP4を作る時によく使うBATです。
使用しているexeは、seraphyさん版avs2wav、neroAacEnc、ffmpeg(何でもOK)、mp4boxです
フォルダ構造はこのようにしてBATと各exeは同じ場所にこの画像のように置いて使って下さい。
・DDAVS_avs2wavtrim.bat
使用しているexeはseraphyさん版avs2wav、neroAacEnc、ffmpegです。このBATにAVSをドラッグすることによりWAV出力、AACにエンコードしたMP4を出力、ボリュームを変更したAACにエンコードしたMP4を出力の3つが行えます。
ffmpegはボリュームを変更したい場合のみに使いますので、そんなことは別のwavgainや他のソフトでやるという方は使う必要はありません。このような感じで入力していってファイルを作ります。BATのあるフォルダにファイルは作成されます。たぶんAVSを使っている人は自分でBAT書いたりスクリプトを書いたり出来るのでまったく無用の長物かもしれませんw
・DDWAV_neroaacenc.bat
DDAVS_avs2wavtrim.batのWAVファイルをドラッグして作る版です。
使用しているexeはneroAacEnc、ffmpegです。このBATにAVSをドラッグすることによりAACにエンコードしたMP4を出力、ボリュームを変更したAACにエンコードしたMP4を出力の2つが行えます。
ffmpegはボリュームを変更したい場合のみに使いますので、そんなことは別のwavgainや他のソフトでやるという方は使う必要はありません。このような感じで入力していってファイルを作ります。
ちなみにWAVファイル以外のMP3などをドラッグした場合どうなるかというところはneroAacEncが正常なWAVファイル以外が全てはじいてしまうので本来は一旦MP3をWAVにデコードする必要があります。ここでわざとこんな感じでボリューム変更を2にしてONにしますとffmpegがWAVに変換しだしますのであえて元ボリュームと同じ256を指定すればボリュームも変わらずMP3から変換できてしまいます。ですがそれはffmpegのWAVデコードを当てにすることになりますので出来ればWAVファイルをドラッグして変換することだけに使って頂ければと思います。
・DD_mp4box_2FILE_ASPECTRATIO.bat
映像1つ、音声1つの2つをMUXしてMP4を作成します。使用しているexeはmp4boxです。
音声、映像と順番に選択して出来れば映像側をつまんでBATにドラッグして下さい。入れた順にMUXしようとしますのでエラーを吐く場合があります。
こんな感じの画面でピクセルのアスペクト比を求めてきますので入力してください。元から正方形ピクセルのものだったりリサイズしてあるものでしたら1:1と入力して下さい(元々640×480だったり1280×720だったりする場合)。何をいってるかわからなければ1:1でまず間違いなく問題ありませんw
・DDMP4_mp4info.bat
mp4ファイルその他mp4boxが対応しているファイルの情報をmp4boxで表示、またはtxt出力します。使用しているexeはmp4boxです。
こちらの記事のmp4のファイル情報はこれで表示した一部を引用していました。-std、-infoでファイルの情報を表示しています。mp4のファイルをドラッグするとこのような画面が出てきます。トラック番号を指定することによってこちらの画面のように表示することも出来ます。txt出力をした場合にはmp4boxがあるディレクトリにmp4info.txtと出力されます。コピペしたい場合にどうぞ。
少しmp4boxを補足しておきますが映像が1つ、音声が3つあったりする場合でもBATにドラッグしても出来るように書けますが、そういった場合は1個1個自分で書いたほうがいいと思います。lang=jpnはぶっちゃけいらないとおもいますが一応日本でおkなので入れてあります。Audioは何なのか識別できるようにname=Audo1とか入れてあります。音声の拡張子にm4aとつけていたりする場合がありますが、拡張子で音声か映像か識別するために勝手につけた拡張子で現時点では正式なものではありません。別に音声しか入っていなくても拡張子はmp4のままで問題ないのです。詳しくはagehaさんのmp4 faqをご覧になって下さい。
mp4box -add "映像.mp4:lang=jpn" -par 1=40:33とかピクセルのアスペクト比 -add "音声1.mp4:lang=jpn:name=Audio1" -add "音声2.mp4:lang=jpn:name=Audio2" -add "音声3.mp4:lang=jpn:name=Audio3" -new "MUXした完成の.mp4"
ついでにチャプターファイルを扱いたい場合は-chap "チャプターファイル.txt"を入れて下さい。-par 1=XX:XXの後ろとかが良いんですかね。どこに入れるべきとかはイマイチわかっていません。ついでにチャプターファイルってどうやって書くのかという話になりますが色んな形式のチャプターがmp4boxではインポート出来るようです。私は以下のような形式のチャプターファイルのtxtをインポートしています。チャプター番号:h:m:s:ms単位で1行、チャプター番号名前:チャプター名で1行で2行で1つのくくりですね。
CHAPTER01=00:00:00.000
CHAPTER01NAME=アヴァン
CHAPTER02=00:02:40.160
CHAPTER02NAME=オープニング
最後に
やばいwww記事が長すぎ!
最後まで読んでくださったり調べている最中にここに行き着いた方でわからないことがありましたら出来る限り答えますのでコメントに残していってください。記事の内容に間違いがあればご指摘頂ければと思います。







