2007-05-09

what niconico wiki's mencoder batch file doing?

前回、mplayerとmencoderについての概要を説明した。今回は、ニコニコ動画のまとめWikiにある、mencoderのバッチファイルが何をしているかを説明してみる。なお、今回は、mencoderのドキュメントを参照しつつ、読んで欲しい。 http://www.mplayerhq.hu/DOCS/man/en/mplayer.1.html

echo オーディオのビットレートを指定(kbps) 例:64 set /p ABITRATE=AudioBitrate: set Audiobitrate=%ABITRATE% REM ビデオフォーマット設定(出力拡張子で自動的に確定) set FORMAT=-of lavf set FOPT=-lavfopts i_certify_that_my_video_stream_does_not_use_b_frames REM 一応入力側の名前に合わせてみる set OUTPUT=-o "%~n1.flv" set INPUT="%~1" REM ビデオコーデック設定 set VCODEC=-ovc vfw set VCOPT=-xvfwopts codec=codecs\vp6vfw.dll:compdata=dialog REM 音声コーデック設定 set ACODEC=-oac mp3lame set ACOPT=-lameopts abr:br=%Audiobitrate% -afresample=44100 REM その他フィルタオプション(現状は上下反転+LanczosResize512x384)-ffourcc VP6F set EXTOPT=-vf flip,scale=512:384 -sws 9 mencoder %FORMAT% %FOPT% %VCODEC% %VCOPT% %ACODEC% %ACOPT%%EXTOPT% %OUTPUT% %INPUT% あとは各自試行錯誤でもしてくれってことで。

これが、FLV4enc_D&D.batの中身である。1パスの、重要な部分だけを抜き出してある。基本的に、最後のmencoderが重要なのだ。このバッチファイルは、FLVにエンコードして、ニコニコにうpするための、最小限のことだけをしている。これを理解して、自分で変更できるようになれば、さらに画質や音質を上げられるだろう。

まず最初のFORMAT変数には、-ofオプションを使い、どのフォーマットで出力するかが指定されている。明示的にflvを指定してもいいのだが、このバッチファイルではそれはしていない。次に、-lavfoptsオプションを使い、出力する動画が、Bフレームを使用していないことを明示している。現在、mencoderではBフレームの出力がサポートされていないからである。 VCODEC変数で、コーデックを指定している、これは、vfw(Video For Windows)を使う。つまり、vp6vfw.dllのことだ。次に続く-xvfwoptsオプションで、読み込むDLLファイルを指定している。また、コーデックの設定ダイアログを開くようにしている。コーデックの設定を自動化する方法があるのだが、それは2パスエンコードのときに説明するつもりだ。

余談だが、mencoderで、とうとう2パスエンコードができるようになったのだ。パッチがいつ、公式のMLに投げられるのか、不明ではあるが、diffは確保したので、いざとなればなんとでもなるだろう。私もUNIX環境のプログラミングを勉強すべきだろうか。

次は音声である。このバッチファイルは、いかなる動画ソースからでも、ニコニコに受け付けられるFLVを作成することを目的としているので、音声はエンコードされる。もし、自前でエンコードした音声がある場合、それを単にコピーすれば、再エンコードされずに、音質がよくなるだろう。FLVコンテナでは、無圧縮PCM、ADPCM、mp3をサポートしている。また、マイクで録音する際に、Nellymoser codecを使用しているようだが、このコーデックの仕様はよく分からない。現在のところ、オープンソースのデコーダーも見当たらない。 mp3へのエンコードは、-oacオプションで、mencoderに組み込まれているmp3lameを利用している。また、FLVコンテナは、 44.1kHz 22.05kHz 11.025kHzのいずれかのサンプリングレートでなければならないようなので、トラブルを防ぐために、-afオプションで、44.1kHzにリサンプルしている。ただし、このリサンプルは、次のEXTOPTで設定されている。ここが個人的に好きではないので、私の自前のバッチファイルでは、変更しているが。

さて、いよいよEXTOPT変数だ。ここにはまず、-vfオプションが指定されている。これは、ビデオフィルタという意味で、文字通りフィルタだ。 まず、flip、これは、VP6のデコーダであるVP6Fが上下反転した出力をするので、workaroundとして入れてある。最初から上下反転したフレームにしておけば、さらに上下反転して、意図通りにデコードされるという寸法だ。しかし、なぜこんなあまのじゃくな仕様なのだろう その次に、動画を512x384にスケーリングする。この解像度でなければ、SIMLEは再エンコードをしてしまうからだ。次に、-swsオプションで、スケーリングのアルゴリズムを設定してる。現在のところ11種類のアルゴリズムが実装されている。9というのは、lanczosアルゴリズムである。非常に品質のいいアルゴリズムとして有名だ。ほとんどの場合はこれでいいのだが、たとえばドット絵、ファミコンやスーパーファミコンなどの動画をエンコードするときは、4のnearest neighborがお勧めかもしれない。もちろん、エンコードする過程でかなり劣化するし、元ソースの画質にも影響されるので、どちらがいいかは、好みの問題ではある。また、先に説明したように、ここで音声リサンプルのための-afオプションが指定されている。 そのあとは、出力と入力のファイルを指定しているだけだ。

PS. やはり、バッチファイルを修正した。-afオプションと、%INPUT%にダブルクオーテーションがついているのを修正した。ダブルクオーテーションは、INPUT変数自体に含めるべき。

No comments: