いつかはAVIを捨てて別のコンテナに移行しないと駄目だなと思っていました。最初にそう思ったのはDVDのトラック2(要するに多チャンネル)に入っている音声をどうする悩んだ時でした。記事のタイトルにあるVFRとはまったく関係ありませんw そこでWMVという選択が一番私の中で有力だったのですが、周りで利用者が増えつつあるMP4やMKVで何とかしようと思ったのが事の発端です。私の身近な周りという意味ではないです^ω^
そしてMP4とMKVはVFR使えるのでせっかくだから出来るようにしようと思ったのがこの記事のはじまりです。
VFRって何?何でそんなことをしなければいけないの?
VFRとはVariable Frame Rateの略で可変フレームレートのことを指し、動画の中でフレームレートを変化させて再生することが可能です。VFRにする必要性は24/30(60)fps混合のインターレースソースが存在していて、それをプログレッシブソースにエンコードした時に不自然なく再生するために有効な手段の1つだからです。こういう書き方をすると堅苦しいのでわかりやすく具体例を出しますと、「アニメを24でエンコして悦にいってたら予告がガタガタだったorz 」というようなアニメのフレームレートを報告するスレの115氏にあるような現象に常に混在ソースは悩まされます。上記スレにはまとめwikiがありまして中には非常にお世話になっている人もいるのではないでしょうか。Tipsにあるフレームレート用語解説とフレームレートの判別方法はわかりやすいと思います。
VFRの他に120fps化してしまう手段もあります。120fps化とは24と30の最小公倍数が120である(24×5、30×4)ことを利用して、空いている部分はnullフレーム(実在しない)を挟んでごまかしてしまうという考え方です。今回は使用コンテナがMP4なので120fpsなnullフレームが使用出来ない(MP4の仕様上は)ためVFRにしなければならないのです。MKVは120fpsでnullフレーム混在なAVI(DivXとかXviDとか)もOKですが、せっかくなのでこちらもVFRで対応しようと思います。
VFRなMP4、MKVを作るいくつかの方法
一番シンプルな方法はフレームレートが異なる部分を分離してエンコードをした後、mp4boxでそれらを合成するという方法です。手動でやる具体的な方法はVFRなMP4を調べていると必ず行き着くこちらを参照して下さい。判定は自分で行う必要がありますが確実です。その判定を自動で出来るフィルタもあり、それらを使用した方法を紹介しようと思います。
自動判定が出来るフィルタは、ITVFR、TIVTC、自動フィールドシフト、などなどあります。中にはタイムコードを出力出来るフィルタもありまして、このタイムコード利用してVFRなMP4を作るという方法になります。
AVISYNTH+x264でraw264形式+Timcodeを吐き、mp4boxで.264と場合によっては音声を合わせてMUXしてMP4にした後に、tc2mp4で最初に吐いたTimecodeとMP4を読み込んでTimeScaleを修正してVFRなMP4を作るやり方はこちらに掲載されていますので、私はAVIUTL+自動フィールドシフト+拡張x264出力を用いた方法を掲載しようと思います!
要するにここまで前置きでしたw長くてごめんなさい!こちらのページを読んで頂いた方に色んな方法があることを知ってもらうのと同時に、需要があると思われるAVIUTL+普段使っている方が多い自動フィールドシフト+拡張x264出力でも出来ちゃうんだよ^ω^ということを伝えたかったのです。ここで知っている人は逆テレシネプラグイン+VFR出力 or x264出力を忘れてないか?と言うと思いますが、理由は単純で私が自動フィールドシフトに頼りきっている使用者だからです。
自動フィールドシフトだってAVISYNTHで使えるよ!という突込みが怖いので一応AVIUTLのプラグインをAVISYNTHで使うための方法が掲載されているページを参照しておきます。ShowAUFInfo.exeさえ使ってしまえばどんな方でもAVIUTLのプラグインをAVISYNTHで使うことが出来るかと思います。
AVIUTL+自動フィールドシフト+拡張x264出力でVFRなMP4、MKVを作成
拡張x264出力はseraphyさんの改造したソフトの「x264 詰め合わせ」をダウンロードしてインストールして下さい。そうするとこの記事の冒頭にあった画像のようにプラグイン出力の欄に拡張x264出力が表示されx264のコマンドラインが入力出来ます。seraphyさんとぽむさんは毎度のこと感謝ですね(`・ω・´)
手順は以下の方法が考えられます。
私はraw形式(.264)で出力をしていますが、直接MP4形式やMKV形式で出力をすればその場でVFR化されたものが出てきます。何故raw形式でやっているのかと聞かれると直接MP4を吐いた物をmp4boxで音声とMUXしたときにVFRになっているのか心配だからです。分割したmp4を個別にFPS指定してaddするならわかるんですが・・・FPS指定しないでMUXすれば済むものなのかどうなんだろうみたいな。要するに私がmp4boxを理解し切れていませんw
↑上のように書きましたが1行目にありますように直接MP4、MKV形式を選択して自動フィールドシフトv7にチェックを入れればVFR化されたMP4が出来ます。x264.exe(x264afs.exe)を通過して出来たものです。その後mp4boxを使い音声とMUXすれば完成でDTSRepairを通す必要はありません。x264スレで混乱させてしまった方がいたようなのでこの場で謝っておきますorzID:FYCjNivgでしたorz
mp4boxについてはこちらが参考になるかと思います。タイムコードでMP4をVFR化する際にtc2mp4ではなくDTSRepairを使用しているのはseraphyさんの拡張x264出力に一緒に入っていたのでそのまま使いました。
何か色んな名前がでてきて日本語でおkエビフにゃイと思われるかもしれません。またコマンドラインは勘弁してくれという人もいるかもしれませんのでコマンドラインを書いておきます。
neroAacEnc -ignorelength -q 0.4 -if "変換元ファイル指定" -of "変換後.m4a"
mp4box -add "RAW形式のファイル指定" -add "さっき変換した音声.m4a" -new "MUXして出力.mp4"
DTSRepair -i "さっきMUXしたMP4.mp4" "タイムコード指定" "完成したMP4.mp4"
1行目のneroAacEncは音声エンコードをneroAacEncにやらせています。q0.4はMP3の128k相当です。確か音声の2PASSとかも出来たはずです。faacでエンコードするのも何も問題ありません。meGUIを使ってGUI上でエンコードしても問題ありません。
1個1個コマンドプロンプトで入力するのが面倒な場合はBATを作ると良いかと思います。私の超手抜きBATはこんな感じです。あまりにひどすぎなのでコメントを入れてフォローしておきました。オーディオコメンタリーなどトラックが複数あるDVDの場合は単純にmp4boxに追加して-addあげれば出来ると思います。parの行はアスペクト比指定ですがエンコード時にアスペクト比が保たれる拡大縮小をした場合は「-par 1=%ACP%」を消してあげるほうがいいとおもいます。
当然VFRじゃないH.264でエンコードしたMP4を作成することは出来ます。拡張x264出力設定の動作設定に自動フィールドシフトv7対応というのにチェックを外せば良いだけです。直接ここでMP4形式で吐いてしまえばmp4boxで音声とMUXする作業だけで終ります。raw264で吐いた場合はmp4boxでMUXする際にはきちんとFPSを指定してあげてください(しないと確かデフォルトFPS25が適応されてしまう)。
MKV出力は図に書いてある通りまだ試していません。ですがraw形式とタイムコードを使いMKVToolnixのmkvmerge GUIを使って試した結果MP4と同様に正常でした。チャプターエディターという便利なものもありアヴァン、オープニング、Aパート、Bパートと区切ったり簡単に出来ます。DVD Decrypterで吐いたチャプター情報のtxtもインポートすることが出来ます。他にも字幕を表示する機能なんかもありますがそれは機会があれば別途紹介しようと思います。
最後に駄文
記事冒頭の画像を見ていただければわかる人もいると思うのですが、x264そのものについてマトリクスに手をつけたりBフレームに詳しく手をつけたりしていません。マトリクスについては理屈的にはこちらがわかりやすく、直感的にはこちらがわかりやすいと思います。
2008/3/20現在では以下のようなコマンドが汎用的なパターンに落ち着きました。一般的なビルドのx264なら以下のでも動くと思います。crf、bframes、qpstep、qpmin、qpmax、scenecutの数値はソースによって変えることにしています。といいつつ--b-biasでBフレームの頻度をコントロールするほどまでは手をつけていません。
--crf 18~22 --scenecut 55~75 --level 4 --keyint 240 or 300 --bframes 3~4 --bime --b-rdo --weightb --direct auto --analyse p8x8,b8x8,i4x4 --8x8dct --trellis 1 --cqm jvt --merange 32 --qpmax 42~38 --qpmin 12~16 --qpstep 6~8 --qcomp 0.7 --ref 3 --mixed-refs --ipratio 1.70 --pbratio 1.50 --subme 6 --no-deblock --no-fast-pskip --threads auto --thread-input --progress --sar XX:XX --no-dct-decimate --no-psnr --no-ssim
本当に一筋縄ではいきませんね!とか偉そうに言っていますが普段の私は時間がかかるWavret系フィルタを使用しないで背景もろとも潰す覚悟で標準ノイズ除去をきつめにかまして済ませた挙句縞を取りこぼすようなズボラーなのです。そんなズボラな私でも簡単に一定の品質を保てて手軽にエンコードできる場所はどこだろうというのを探しているに過ぎません^ω^ その基準値は人によって差異がありますが、このように動画に関わっていると目が肥えてきて基準値が膨れ上がっていくものだと理解しました。以前私もしていた更にひどい手抜きなエンコードをしている人を見ると「それはネーヨ!」と色々言いだすことが物語っています。人に聞かれたときに思わず「それはネーヨ!」と頭ごなしに言い放ち萎えさせるケースが増えるのは困るので、出来るだけ理屈、直感の両面からわかりやすく説明できるように心がけます\(^o^)/