ニコニコでこの動画を見たついでに、うたわれるものを4話まで観たら、なかなか面白かった。
mencoderでVP7のエンコードをしてみようと思ったのだが、どうもうまくいかない。
まず、vfw2mencでエンコードの設定を保存しようとしたのだが、保存したファイルを、mencoderで読み込ませようとすると失敗する。設定ダイアログを開くことはできるので、手動でエンコードしようとしたが、これもうまくいかない。エンコードはできるのだが、再生できない。不思議に思って出力されたAVIファイルを調べてみると、どうもFourCCの値がおかしい。VP70であるべきなのに、変な値になっている。そもそも、可読域ではない値だ。バイナリエディタでVP70に修正してみると、あっさりと再生できた。
問題は、ffourccオプションが働かないとはどういうことだろう。何のためのfourcc強制オプションだ。
肝心のVP7の画質だが、かなりのっぺりとした結果になる。ウェーブレットでもかけたような感じだ。恐らくアニメなどをエンコードするにはいいと思われる。FLVの動画コーデックの指定には4ビットが使われており、現在6種類のコーデックをサポートしている。つまり、まだ10個分空きがあるのだ。もし、FLVでサポートして欲しいとしたら、何を望むだろう。H264、VP7などだろうか。
なお、今回思わぬ発見をした。mplayerでVP6を再生するとやけにブロックノイズが目立つが、これはffmpegのVP6の独自実装のデコーダのためである。vp6vfw.dllでデコードするためには、-vc vp6 と指定してやれば良い。追記:自動改行に頼っていた古い記事を整形。内容は結構古いので、今はどうなっているか分からない。
ソー、ディスタイム、ウィーアーゴーイングトゥトークアバウトデインターレース。
さて、インターレス解除の方法であるが、その前にひとつ、どうしても言わなければならないことがある。
曰く、「完璧を求めるならば、アナログなディスプレイで見ればいい」
本当に、これに尽きる。完璧なデインターレス方法などない。最良の方法とは、最初からインターレスなソースを用いないことだ。とは言え、入手可能な最良のソースがインターレスを含んでいることは往々にしてあることだ。なんとかして、インターレスは除かねばならない。
さて、mencoderに詳しくない者は、ひょっとしたら、mencoder以外でインターレスを解除しているかも知れぬ。ところが、mencoderには、最強のインターレス解除方法も備わっているのだ。早速見ていこう。
インターレスを解除するには、vf 引数、つまりビデオフィルタを使う。最も単純なのは、ppから始まる一連のフィルタだ。たとえば、pp=lbはLinear Blendであるし、pp=liはLinear Interpolationだ。基本的にこれらを使う。個人的には、PP系の中では、Cublic Interpolationがお勧めだ。これらは組み合わせて使うことも出来る。たとえば、pp=ci,pp=l5は、キューブリックインターポレーションの後に、ローパスフィルタをかけている。
PP以外のデインターレスフィルタはどうかというと、こちらはより賢い方法を採用している。たとえば、動画が実際より3/2フレーム数の多い、テレシネであった場合、逆テレシネを利用して、実に効果的にインターレスの解除が行える、pullupやfilmdintなどだ。もちろん、このフィルタを利用するには、テレシネ動画で無ければならないのだが。
さて、テレシネ動画でない場合、どうすればいいのか。ここで、かなり汎用的に使えて、性能のいいフィルタがある。yadif(Yet Another DeInterlace Filterの略)というフィルタだ。この性能はすばらしい。たいていの場合で、困ることはない。使い方だが、1フレーム毎に処理したいならば、yadif=0を使う。1フィールド毎に処理したいならば、yadif=1を使う。2や3は、spatial interlacingを行わない、0や1のことだ。yadif=1を使う場合は、framestep等を使い、フレームを脱落させるか、あるいは出力するFPSを倍にしないと、泣きを見ることになる。フレームがフィールド単位に分離されているからだ。単純に2倍になる。
さて、更なる高みを目指したい人は続きを読んで欲しい。最強のフィルタがある。その名はmcdeintだ。これは、動き補正をしつつインターレスを解除を行うという、恐ろしいフィルタだ。何が恐ろしいといって、物凄く遅い。現状のどんなCPUを使っても、エンコードのFPSは一桁を切るだろう。0.1、0.01の世界にまで落ち込む。
使い方は次の通り、
yadif=3,mcdeint=2,framestep=2
mcdeintは、それ自体でフィールド分離機能を持っていないので、フィールドを分離する、tfields=1や、yadif=1, yadif=3などを一緒に使わなければならない。そして、FPSが倍になっているので、単純にフレームを脱落させ、元のFPSに戻すか、FPSを倍にしなければならない。なお、mcdeint=3ならば、さらに遅くなる。これは劇的に遅いが、最強だ。