ビデオサーバに大切な物
ビデオサーバの性能を左右する最大のものはマシンスペックではありません。アンテナです。前述した通り、Pentium II 233MHz程度でも解像度320x240 30fpsのキャプチャは可能であり、この程度のキャプチャができれば、十分ノーマルVHSに対抗することが可能です。もはやPentium IIのマシンなどゴミでしょうし、今、ビデオサーバなんてものを考えてる人にとっては、すでにマシンスペックを気にする必要のない時代だと思われます。
しかし、どんなにハイスペックなマシンであってもアンテナがダメでは、ビデオサーバとしてまったく役に立ちません。残念ながらアンテナは非常に奥が深い代物で、簡単にはどうこうできず、どうこうしようと思ったら、専門の知識が必要ですので、どうこうしようと思う人はそちらにあたってください。このビデオサーバの場合は、ケーブルテレビのパススルーなので環境としては最高の部類だと思います。ビデオサーバを作ってみようと思い立った動機の一つです。
キャプチャ時のmencoderオプション
このビデオサーバでは、キャプチャはmjpegで行い、その後、適当に圧縮するのが通例です。リアルタイムで圧縮率の高いフォーマットにエンコードするのは、フィルタ処理に制限が出るし、必ずしも合理的ではないと思います。mjpegで単純にキャプチャし、各種のフィルタ処理はノンリアルでタラタラやるのがきれいなファイルを作るコツです。
そんなわけで、キャプチャ時のオプションは、そんなにありません(でも、けっこう長いな)。以下が、このビデオサーバの標準的オプションです。不要なパラメータもいくつかありますが、おまじないです。とくにひねったところはなく、これが素のキャプチャと言えるぐらいのものです。素なので、コーミングも出るし、ノイズもあります。それらは圧縮時に取り除きます。
v4lctl setchannel 1
mencoder tv:// -tv driver=v4l2:device=/dev/video0:normid=1:amode=1:fps=29.971:width=640:height=480\
-ofps 29.971 -ovc lavc -oac pcm -lavcopts vcodec=mjpeg:autoaspect -o $tm_f -endpos 1800
normidは単純に言えばチューナの種類で、日本では、NTSCかNTSC-JP、1か6です。どちらかはハードによるようです。amodeは音声多重のステレオです。-ovcはキャプチャのコーデック、lavcを指定し、-lavcopts vcodecで指定しています。-oacは、audio codecで、pcmで生録りしています。今どきのマシンなら、音声ぐらい圧縮しても屁でもないでしょうが、Pentium IIが現役の我がLANにおける安全指向の保険です。
そう言えば、mencoder(mplayer)では、なぜかチャンネルを変えることができません、…バグ?他のv4l操作は普通にできるようなので、なんかバグっぽいですね。ということで、チャンネルを変えるときは、直接、v4lctl setchannelを実行しています。
これで、およそ6GB/hくらいのファイルができあがります。例では、-endpos 1800、すなわち1800秒、30分なので、およそ3GBのファイルが作られます。
圧縮時のmencoderオプション
mjpegでキャプチャしたファイルを圧縮します。divxで1600kbpsぐらいに圧縮すれば、十分な画質が得られます。所詮、うちのキャプチャカードはBt878であり、ソースのクオリティが限られているので、ビットレートを上げたところで画質はさほど向上しません。画質は、ビットレートよりむしろフィルタ処理の方が重要です。というわけで、ファイルサイズを考えると、経験上、1600kbpsくらいがもっともコストパフォーマンスがいいんじゃないかと思います。一時間、800MB程度です。400x300でキャプチャしたもの(ビデオサーバ、himawariの限界、と言うかPentium II 333MHzの限界)を適切なフィルタをかけ、1600kbpsでdivxにしたものは、ノーマルVHSに勝っていると思うし、640x480でキャプチャしたもの(ビデオサーバ、nadesico fusion878Aの限界)を適切なフィルタをかけ、1600kbpsでdivxにしたものは、通常のHDDレコーダで録画したものに対抗しうると思っています(さすがに勝つのは無理ですが)。
その半分の800kbpsくらいだと30分200MBくらいになり、非常に扱いやすくなるのですが、640x480のサイズにこだわると多少無理を感じます。動きの少ないアニメとかだと、これでもなかなかの画質を見せるものの、条件が厳しくなるとブロックノイズ、その他で大変になってきます。でも、見れないほどではないのが微妙なところです。ここら辺は、個人差もあるところなので、やっぱり実際やってみるしかないというのが基本です。ちなみに、最初、800kbpsにこだわっていたのは、800kbpsが我が家のADSL環境におけるアップロード速度の限界値であり、800kbpsならギリギリ、ストリーミングが可能かもしれないと思われたからです。実際にはちょっときついですが。
mencoder -ovc lavc -oac lavc -lavcopts vcodec=mpeg4:acodec=mp3:mbd=1 \
-vf pp=lb,scale=640:480,pp=de,hqdn3d -o newfile originalfile
おおよそ、圧縮時もキャプチャ時のオプションとコーデック以外あまり変わりません。大きく異なるのが、-vfのフィルタオプションです。mbd=1も、フィルタの一種みたいなものと思ってください。圧縮のクオリティが上がるそうです(ただし、wmvでは使えないようです。画像が乱れてしまいます MEncoder 1.0pre6-3.3.2)。フィルタは大変複雑で、何が最適かは本当にわからないものです。そんな試行錯誤の末、辿り着いた結論は、あまりいじっても意味がない、です。pp=lbでデインターレイス、scale=640:480でサイズを変更し(640x480でない場合)、pp=deでブロックノイズの除去、リンギング等の一般的なフィルタをかけ、最後にhqdn3dで最終的なノイズリダクションを行うぐらいが妥当だと思います。
ちなみに、このhqdn3dは大変重い処理で、Pentium II 333MHzのマシンにこの処理をやらせると8~9倍の時間がかかってしまいます。しかたなく、pp=de,hqdn3dの変わりにpp=de/tnで済ましてしまうこともしばしばです。tnよりhqdn3dの方が優秀なデノイズフィルタですが、重すぎます。もっとも、これぐらいのフィルタ処理をやらせる
と、デノイズフィルタを軽めなtnにしたところで、それでも6倍弱かかってしまうので、変わらないと言えば変わらないのですが、悠長なことを言っていると次の日のキャプチャが始まってしまうので、そう悠長なことも言っていられません。ちなみにこの圧縮処理を自慢のハイパワーマシン、Celeron 850MHzのnadesicoにやらせても、二倍強の時間がかかります。