PCのハード、ソフト、ガジェット(主にiPhone)系の話題が中心 
 
 

アンチ TMPGEnc に煽られて x264 を使ってみようとした

2ちゃんねるの DTV 板には TMPGEnc を目の仇にしているような書き込みが散見されます。正確には TMPGEnc の H.264 エンジンがやべーよまじきたねーよというような感じです。後はアニオタを目の仇にしている人が多いです。何なんでしょう。キモイのには私自身を含めて同意しますが、わざわざ書き込む必要があるのでしょうか、アニメに親を殺された経緯でもお持ちなのでしょうか、だとしたら心中お察しします。

というようなどうでも良い話はおいておいて、とにかく TMPGEnc の H.264 は糞だから x264 を使えというアドバイスが多いように感じられます。標準規格化されている仕様通りに作られているはずのエンコーダが何で種類によってできあがりが違うのか私には理解できないのですが、事実そうらしいです。固定量子化で H.264 に TMPGEnc で行った場合、空など何も無い場所でザワザワノイズが発生し、そのおかげで画質は落ちるわファイルサイズは膨大になるわろくなことが無いそうです。まあ、それはノイズフィルタをかけることである程度軽減されるみたいですけど。というか固定量子化使ったことないや。だってできあがるまでファイルサイズがわからないんだもん。何回もエンコード試すなんて時間の無駄じゃないですか。それこそエンコード間に合わなくなっちゃうよ。VBR 1pass 最高!といいつつ、固定量子化も試してみたくなってたりなってなかったり。

話はずれましたが、そこまで x264 が素晴らしいのならば試してみようじゃないかと思い立ったわけです。ところがそれにはいくつかの難関があります。まず地上デジタル放送を録画した際にできあがる MPEG2-TS ファイルなのですが、音声が AC-3 という形式で対応している動画編集ソフトが限られるのです。皆の味方、高機能動画編集フリーウェア Aviutl でも動画部分はまるも氏の作成した MPEG2-Plugin で読めるものの、音声はまったく駄目。分離して無圧縮ファイルにでもして動画と音声を別々に処理するか、BonDemux 等でいったん PS 化して同時に音声部分を wav や mp3 に中間出力して Aviutl に読ませるしかありません。しかし、このほうほうはどうも好きになれない。TMPGEnc はそのまま読んでそのまま編集できるのに、一旦違う形式のファイルにしてから読み込まなきゃいけないとは何事だと。しかもその際音がずれるとかそういうトラブルにも見まわれるし、Aviutl で MPEG2 ファイルを読み込む際は GOP の作成とかで時間がかかるしこれはいかんと思ったわけです。後あんまり Aviutl の x264 拡張出力のダイアログ好きになれないんだよね。ごちゃごちゃしてるし。コマンドラインでパラメータ指定して出力するほうが好きだな。

というわけで、これまでとは違う方法で TS ファイルを x264 を使って H.264 化させたいと考えたわけです。調べた結果、このような手順で行えばスマートにいけるのではないかと考え付きました。

1. TS ファイルを DGIndex で読んで音声を分離し、AVS ファイルで擬似単一ファイル化
2. フィルタ等の記述の追加
3. 編集するのであればその AVS ファイルを Aviutl で読んで、Crop プラグインで追加記述
4. x264 で動画部分をエンコード
5. NeroEncoder で音声部分をエンコード
6. MP4Box で映像部と音声部を mux してひとつのファイルに

なんだ、糞面倒じゃんと思ったあなた。実はこの作業、二つのバッチファイルにドラッグ&ドロップするだけで実現可能なのです。無編集かつ予めかけるフィルタや取り出す PID を知っている場合に限りますけど。
参考にしたのは下記サイト。
TSからmp4のメモ -GALACTIC FUNK
ニコニコ動画 x264cliを使用したH.264エンコードについて (2009/09/02版) -ネーミングセンスがないわけだが
理解力がある人はこの二つ見ただけで大体何をすればいいかわかっちゃって私の説明なんか不要だと思うけど、一応やったことのまとめとかミスって躓いたところとか備忘録的に記しておく。


ダウンロードしておくものリスト
DGIndex
AviSynth
BeHappy_r13913.7z 内のBassAudio.dll
一番上の base24 と真ん中くらいにある base_AC3 の中にある DLL
 以上 3 つの DLL と、DGIndex ディレクトリにある DGDecode.dll をインストールしてできた Avisynth のプラグインフォルダにぶち込む。DGIndex は適当な場所に解凍し、環境変数の path の値にそのディレクトリ追加しておく。よくわかんなかったらフォルダの中身 system32 フォルダの中とかにぶち込んでショートカット作ってデスクトップにでも置いとけ。
ツールとバッチファイルのセット
x264Cli の x264.exe
 ※俺 Windows7 64bit だから 64bit 版選ぶぜ!とか考えて 64bit をおろさないこと。32bit 版をダウンロード。
  何か知んないけど 64bit だと Avisynth スクリプト読んでくれない
 ※何か現在サイトがよくわかんないことになってる。他のところでダウンロードしてください。
NeroAACコーデック内の neroAacEnc.exe
 以上二つのファイルをツールとバッチファイルのセットの x264bat フォルダ内にぶち込むバッチファイルの作成
バッチファイル1

DGIndex -IF=[%~1] -AP=112 -VP=111 -PP=100 -OM=1 -OF=[%~1] -AT=[template.avs] -EXIT

AP と VP はそれぞれ音声部と映像部の PID が入る。TMPGEnc Mpeg editor 3 で編集出力した動画ファイルの場合は VP は不要で AP を 60 にしたらうまく出力できた。PID なんか知るかっていう人のほうが多いと思うので、一旦 DGIndex に読ませて <メニュー>-<Stream>-<Detect PIDs: PAT/PMT>を選択し、一番上の MPEG2 video と AC3 audio の 16 進のほうの数字をそれぞれ入れればよかったはず。確か。
このバッチファイルと同ディレクトリに下記内容の template.avs というファイルも作る。

LoadPlugin(plugin+"DGDecode.dll")
LoadPlugin(plugin+"bassAudio.dll")
v=DGIndex_MPEG2Source("__vid__")
a=bassAudioSource("__aud__")
AudioDub(v,a)
DelayAudio(__del__)
rem 以下にその他フィルタを記述


これでバッチファイルに TS ファイルを放り込むと d2v,ac3,avs のそれぞれファイルを生成してくれるはず。avs ファイルを aviutl で開いてみて映像と音声が出ればおk。
※ ac3 できねえという人は LoadPlugin の中のパスを両方とも絶対パスにしてみて。あれ、もしかしてこのバッチファイルって avisynth のフォルダの中に作ること想定されてるのかな。どおりでできなかったわけだなあ。
※ 映像がずっと出てこなくて参ってたんだけど、MPEG2Source だけじゃ別の関数読んでたみたい。上記のように接頭語つけたら難なく読み込めたよ。

編集(といってもカットだけだが)したい方は aviutl で trim 値のエキスポートで avs に自動追加記述しよう。後は自力でavisynth の関数調べて Crop とかノイズフィルタとか追加するしかないかな。予め決まってるんだったら templete.avs に追加しておけばいいと思うよ。
(もちろんそのまま aviutl で編集してフィルタかけて x264 拡張出力でエンコードしても良いよ)

んで、後は x264bat 内のバッチファイルに avs を放り込んだら mp4 ファイルができるはずなんだけど…。うまくいかないよね。私だけじゃないよね。どう考えても何か中の記述おかしいもんね。
というわけで修正したバッチファイルの中身記述

@echo off
cd /d "%~dp0"
if "%~1" == "" goto error
echo 音声抽出を開始します。
avs2wav2g "%~1" "%~dp1%~n1.wav"
echo 音声エンコードを開始します。
neroAacEnc.exe -br 128000 -2pass -if "%~dp1%~n1.wav" -of "%~dp1%~n1.sound.mp4"
echo 音声エンコードを完了しました。
echo 動画エンコード 1パス目の処理を開始します。
x264.exe --bitrate 1600 --pass 1 --8x8dct --cqm jvt --ref 6 --mixed-refs --b-adapt 2 --bframes 6 --b-pyramid --no-fast-pskip --no-dct-decimate --level 4.2 --output "%~dp1%~n1.mp4" "%~1"
echo 動画エンコード 2パス目の処理を開始します。
x264.exe --bitrate 1600 --pass 2 --8x8dct --cqm jvt --ref 6 --mixed-refs --b-adapt 2 --bframes 6 --b-pyramid --weightb --direct auto --me umh --subme 9 --trellis 2 --no-fast-pskip --no-dct-decimate --level 4.2 --output "%~dp1%~n1.mp4" "%~1"
echo 動画エンコードを完了しました。
echo 動画と音声を結合します。
MP4Box.exe -add "%~dp1%~n1.video.mp4" -add "%~dp1%~n1.sound.mp4" -new "%~dp1%~n1.mp4"
echo 処理を完了しました。
pause
exit

:error
echo avsファイルをドラッグドロップしてください。
pause

1pass にしたかったり固定量子化したかったりする方は x264 のオプションを各自いじってくださあ。
このバッチファイルに avs を放り込んでほっとけば同ディレクトリに mp4 ファイルができているはずです。お疲れ様でした。

ここまで見てどう思いましたか?
全部フリーソフトでできてお手ごろと思いましたか?
avisynth スクリプトを編集することでどんなフィルタも自由に追加して便利だと思いましたか?
aviutl を併用することで avisynth に trim 値を自動入力できて便利だと思いましたか?
x264 にあらかじめパラメータを指定しておいてバッチファイルでエンコードできて便利と思いましたか?
私はですね

め ん ど く さ い と 思 い ま し た ね

ここまで用意して、確かに無編集だったらバッチファイル二つ通すだけですよ。でもね、編集は結局 aviutl でやんなきゃいけないし、途中経過のファイルはいくつもできるし、それになんといっても avisynth のフィルタとか調べんの面倒だし、レターボックスの映像とかどうやったらいいか直感でわかんないし。改めて TMPGEnc の偉大さを思い知ったところです。結局 TMPGEnc でエンコードすることにして、ノイズフィルタがしがしかけて固定量子化を試してみます。画質信奉の皆様は x264 の布教とアニオタ迫害がんばって下さい。私は利便性を取って迫害されながら TMPGEnc を使い続けようと思います。じゃあね ノシ
   21:07 | Trackback:0 | Comment:0 | Top

Comment







(編集・削除用)


管理者にだけ表示を許可

Trackback

http://denjipa.blog49.fc2.com/tb.php/199-866d165d
 
 
 
検索フォーム
RSSリンクの表示
リンク
Powered By FC2ブログ

今すぐブログを作ろう!

Powered By FC2ブログ

楽天