Linuxでビデオサーバを構築せよ

最近はずいぶんとjunkの質も向上し、Coppermine-128k Celeronなら 百円単位で買えるようになってしまいました。マルチメディアの対応にはハードの更新が不可欠と二の足 を踏んでいた私も、身動きのとりやすい情勢となりました。そんなおり、TVK-401というBt878のありがち なキャプチャカードが1,000円で落ちていたので洒落で買ってみたところ、これがけっこう使えるという ことがわかり、ビデオサーバを構築する流れとなったのでした。

ここでは、そのビデオサーバ構築に関する一連の事柄を紹介していきたいと思います。このビデオサーバ は、すべてシェルスクリプトにより構成されており、あくまで日常作業を自動化したものに過ぎませんが、 ビデオサーバというものは、個々の環境、用途に非常に依存するものなので、一般化が大変難しく、ここで 紹介することも、たぶん他の環境で再現することは事実上困難でしょう。また、このページは、こうすれば できるといった解決法を紹介しているわけでもないので直接の参考にもならないと思われます。と言うわけ で、ここでのお話は、これからビデオサーバを作ってみようと思ってる人へ贈る先人の経験談と言ったところ です。

…とは言え、そう独りよがりでも仕方がないので、簡単に導入可能なrpmも作ってみました。ビデオサーバの 一番大きな問題は起動の管理ですが、これは、OS上では吸収できない環境差に起因する根本的な問題なので 一般的な解答を提示することが極めて困難です。しかし、それに目をつぶれば、たとえば動かしっぱなしに すると割り切れば、あとは非常に簡単です。rpmでインストールし、cgiを使えるようにすれば、すぐ使えます。 お手軽に試してみたい人はこちらのページへどうぞ。→menat video server


実行している環境は、主機、Optiplex GXa (Pentium II 333MHz RAM 320MB)、サブ機 自作 MS6163 Celeron 850MHz(お約束OC) RAM 384MB、OSは、両機ともにVine Linux 3.1です。Pentium II 333MHzでキャプチャ なんて信じられない人もいるかもしれませんが、これでも、400x300 29.97fpsでキャプチャ可能です。これ ぐらいなら、十分、ノーマルVHSの画質を越えることができるので、実用上十分に思われます。それ以上のモノ を求めるとなると、そもそもBt8x8という選択からして間違いなので、別な話でしょう。

1.起動に関する問題
2.設計方針
3.ハードウェア
4.ソフトウェア
5.ビデオサーバマニュアル
6.実際のキャプチャにおけるtips
7.DVD化
8.まとめ

1.起動に関する問題

ビデオサーバ構築にあたり、一番最初に決めなければならないことはなにかと言えば、それは、 そのビデオサーバをどうやって起動させるかということです。ビデオサーバと言うからには、 予約録画がその主な仕事であり、時間通りに起動せねばなりませんが、ビデオサーバのOS上から 自分自身を起動させることはできません。よって、ビデオサーバのOSとは無関係な起動手段を 用意する必要があります。以下、おおまかな選択肢です。

1.動かしっぱなしにする。
2.Wakeup On LANなど、BIOSの機能を使う。
3.UPSなど、その他の特殊機具を使う

一番簡単なのは、当然、「1.動かしっぱなしにする。」ですが、あまりスマートではありません。2.のBIOSの 機能を使う場合は、それにあったハードをまず選択せねばならず、この問題がビデオサーバ構築における 第一命題であることがわかります。このBIOSによる起動で有名なのはWOLですが、他にもRTCから起動する ものや、モデムから起動させるものなど様々あります。しかし、通常、これらの機能は注目されることが まれなため、情報も乏しく、BIOS由来の機能であるため独自仕様である場合もあり、けっこう扱うのが たいへんです。3.は、UPSやタイマー起動可能なキャプチャカードなど特殊なハードを使う方法ですが、あまり 一般的とは言えないので割愛します。ATXなパソコンをタイマー起動させるハードは理論的には簡単に作成可能 ですが、そういう商品が現実的に存在しないことから考えると、タイマー起動という機能に対する需要がない ことが良くわかります。引いては、それは、パソコンでビデオサーバを構築することに対する現実の需要をも 教えています。

現実的な2.の選択肢において、もっとも実績ある起動法はWOLですが、WOLで起動させる場合は、WOLを制御する サーバが動いていなければならず、結局、「1.動かしっぱなしにする。」と同義になる場合もあるでしょう。WOLで 起動を制御するという選択肢が有効なのは、ビデオサーバ以外に実働しているサーバを持っている人で、その ような場合は、そのサーバに時間管理をさせるのが合理的と思われます。今、私のビデオサーバはWOLで起動を 制御されていますが、このwebページを配信しているwebサーバ(メインサーバ)がビデオサーバの起動も管理して います。

ちなみに私のビデオサーバ、Dell Optiplex GXaは、RTCから起動する機能を持っており、最初は、WOLによる起動ではなく、RTCにより毎日00:00に起動する ようにしていました。毎日00:00に起動し、その日の予約録画が終了するとシャットダウンし、次の00:00に なるとまた起動するということの繰り返しです。これは当初、私の予約録画が深夜に集中していたため起動を 細かく制御する必要がなかったからで、それなりに有効な解でした。その後、予約録画の利便性、信頼性に自信 が持てるようになったので、メインの録画環境を家電からこのビデオサーバに移し、それと同時にWOLによる起動 へと変更したのでした。実は、最初からWOLにしなかったのは、現実問題として、WOL対応のNICを持っていなかっ た(Optiplex GXaのon board LANはWOLに対応していない)からだったり、Optiplex GXaのPCIバスは二つで、あまり バスを埋めたくなかったなど、ハードに制限された苦い経験でもあります。

2.設計方針

起動の方法が決まったら、ビデオサーバの設計方針を決めます。ビデオサーバ構築に要求される知識は、概ね 専門的な知識ではなく、浅くても広範な知識です。それは、ハードウェアのセッティング、ソフトウェアの インストール、ネットワーク、時間管理、雑事のスクリプト化、キャプチャ、圧縮の最適化、等々、日常的な 作業の集大成とも言えるもので、そういう視点から見るとビデオサーバの設計方針に大切なのは技術的なこと ではなく、むしろコンセプトそのものだということがわかります。コンセプトというものは、そう簡単には 古くならないものなので、最初にしっかり建てておくことが重要、有効です…ということが、後から、良く わかりました。

前述したように私の環境では、すでに実働中のサーバがあるので、時間管理はこのメインサーバによって制御 可能です。ということで、基本方針として、ビデオサーバの予約録画情報をこのメインサーバで共有すること とし、cgiによりweb上からメインサーバの情報を操作、ビデオサーバは、そのメインサーバ上の予約録画情報 を参照(実際にはsambaによる共有)して動作するということにします。メインサーバは常に稼働しているので、 予約録画情報は常に変更可能であり、メインサーバは予約録画情報を監視しつつ、適切な時間にWOLでビデオ サーバを起動させることになります。起動したビデオサーバはメインサーバ上の予約録画情報を参照し、atdの 登録情報を更新、後はatdに管理を任せます。キャプチャ、圧縮が終了し、次のキャプチャまで一定の時間がある など条件がそろうとビデオサーバは自らshutdownします。

メインサーバがビデオサーバを起動させるこの方針の欠点は、ビデオサーバ起動のタイムラグのため、即時の 録画には対応できないこと、二つのマシンを動作させるため、その分、複雑になることです。また、この方針は、 メインサーバがすでに存在する環境では導入しやすいと思われますが、ビデオサーバ構築のため、それを制御 するメインサーバも新たに構築するとなると事の大きさはとりとめがなくなってしまい、初心者には相当敷居が 高いでしょう。

ビデオサーバの実装としては、ウェブ上からすべてを制御し、起動からキャプチャ、そして圧縮、終わったら シャットダウンまで完結することが目標です。わかりやすさを優先し(個人的な趣味で)、cgiその他すべてを シェルスクリプトにしました。結局、それらスクリプト群は、全部合わせて100KBを越えてしまいました。 このwebサーバ(486DX4 75MHz)でそのcgiを動かすとさすがに激重です。まぁ、普段はLAN内のP!!!機で処理する ので気にはならないのですが、外から予約録画するため、このサーバを使わなければならないときは少し苛つきます。

また、ビデオサーバ構築の動機は家電のビデオデッキに対する不満を解消するためでもあり、その不満とは、 やはりインターフェイスに対する不満です。家電のビデオデッキの録画予約では、過去の録画予約のデータを 残しません。少なくとも私がこれまで使ったことのあるビデオデッキではそうでした。それらのデータをビデオ そのものに書き込んでくれるものもありましたが、いちいちそのビデオを見なくてはそれらの記録を参照できない のでは役に立ちません。そういうわけで、細かくログをとり、自分で何を実行したか正確に把握できるように しています。


3.ハードウェア

最近(これを書いてるのは2005-01-10)のマシンなら、最初にとりあげた起動に関する問題以外は、とくにどんな ものでも問題はないと思います。Pentium II 233MHzでも解像度320x240 30fps(mjpeg)のキャプチャは可能であり、 この程度でもノーマルVHSには十分対抗できます。ただ、低スペックのマシンだと圧縮させる時、無茶苦茶時間が かかるので、もちろん速いにこしたことはありません。

640x480でのフルサイズキャプチャは、P!!! 600MHzぐらいから可能だと思いますが、これはPentium!!!の拡張命令 の力が大きいので、CPUスピードがあっても、拡張命令なしではなかなか大変です。ちなみに、PentiumII用に コンパイルされたmencoderでは、Celeron 733MHzでも480x360のキャプチャがやっとでした。詳しい事情は知りません が、確かCPUスピードが速くても、586なCPUがあったような気がするので、気をつけるに越したことはないでしょう。

キャプチャカードは、Linuxで動く物ならなんでもいいのですが、ポピュラーなBt8x8は今や手に入りにくくなり ました。最近はハードウェアエンコーディングのカードも使えるようになって来たようですが、最近のCPUパワー を考えれば、ソフトウェアエンコーディングの柔軟性も捨てがたいと思います。ここで使っているカードは、Bt878の αデータTVK-401とFusion 878AのNEC SmartVision PK-UG-X024です。双方とも、bttvで、TVK-401は自動 認識、SmartVisionは、card=99 tuner=15で使えます。

ただし、SmartVisionの音声多重機能は、ステレオ決め打ちになり、副音声が選択できません。また、Composite1で は音声入力が死んでいます。副音声の選択、Composite1での音声入力を有効にするには、bttvにパッチをあてる 必要があります。通常の使用では、素のままでも問題ないと思うのですが、敢えて面倒なことをしたい人のために パッチを用意しました。パッチをあてるとSmartVisionも自動認識されるようになります。

PK-UG-X024.patchについて

メモリは256MB以上あれば十分です。ハードディスクは大きいのが良いというだけでなんでもいいです。 おおよそ、mjpegで解像度320x240だと2.4GB/h、640x480だと6GB/hくらいになります。大量のデータを転送する ため転送速度も気になるところですが、640x480 mjpegでも、せいぜい16Mbps(2MB/s)程度ですし、UDMA33で も20MB/sくらいは出るでしょうから、少々のオーバーヘッドを考慮してもさほど気にするほどのことでも ないでしょう。

ビデオカードは、ビデオサーバで視聴することを考えなければなんでもいいです。サウンドカードもなんでも いいのですが、視聴感はサウンドのノイズに大きく左右されるので気を配りたいところです。もっとも、ノイズは サウンドカードのみに依存する問題ではなく、PC内の配線の取り回しに左右されたり、高いカードだから低ノイズ とも限らなかったり、実際、動かしてみなければわからない部分が大きいのが難点です。当初、サブのビデオサーバ にはHPT368のUDMA66カードをさしていましたが、ノイズ対策ではずしました。実際どの程度の影響があるのかは 不明ですが、ノイズ源は少ないに越したことはありません。

一番最初に話題にしたWOL対応NICは、WOLケーブルが付属してない場合もあるらしいという話も聞くので購入 の際は気をつける必要があります。通常の小売店でWOLケーブル単品を見つけることは至難です。こういうもの が秋葉原のどこに行けば手に入るか知っているのがジャンク者としての自慢です。

himawari.karing.jp
vender and type
Dell Optiplex GXa
CPU Intel Pentium II 333MHz
chip set Intel 440LX
RAM SDRAM 320MB
HDD Maxtor 2F030J0 30750MB
CD-ROM NEC CD-ROM DRIVE:28B 32x
on board video ATI Rage Pro SGRAM 4MB 
NIC IBM 82558B Ethernet Pro 10/100
on board sound CS4236B
TV capture card
αデータ TVK-401
SCSI card ADAPTEC AHA1510A
O.S.
Vine Linux 3.1
video server main software
MEncoder 1.0pre6a-3.3.2
nadesico.karing.jp
mother board
Micro Star ms6163
CPU Intel Celeron 566MHz(850MHz 8.5x100MHz OC)
chip set Intel 440BX
RAM SDRAM 384MB
HDD  FUJITSU MPE3084AE 8455MB
HDD
IBM IC35L060AVV207-0 40016MB
CD-ROM NEC CD-ROM DRIVE:28B 32x
video card
ATI Rage IIc SGRAM 4MB 
NIC Intel EtherExpress PRO/100+
sound card
MINTON SP401F YMF724
TV capture card
NEC SmartVision PK-UG-X024
O.S.
Vine Linux 3.1
video server main software
MEncoder 1.0pre6a-3.3.2

画質に関しては、bt878の特徴である白とび黒つぶれはしかたないものの、コストパフォーマンスを考えれば十分合格点だと思います。 himawari のTVK-401はモノラル、nadesicoのSmartVisionは音声多重です。TVK-401は、キャプチャ時にほんのわずかノイ ズがあるのですが、コンポジット入力ではノイズはのらないのでチューナーが拾っているようです。そんなとき、たまたまSmartVisionが手に入 り、試してみると具合いが良さそうだったので、キャプチャカードを交換するよりも、いっそサブ機構築となったのでした。実は、TVキャプチャを始めて一番 感動したのはその音質で、家電の環境ではステレオでテレビを観ることはないので、ステレオ再生時の音質の良さにはちょっと感動しました。nadesico の YMF724はノイズも少なく、音像も鮮明で、これまで使ったサウンドカードの中で一番満足しています。


4.ソフトウェア

このビデオサーバで一番働いているのが、mencoder(MPlayer)です。キャプチャに圧縮にと大活躍です。インストールの仕方について 以前書いたものがありますので、参考にしてください(MPlayerでMedia Playerコンテンツを再生!)。

もう一つ、重要なソフトにxawtvがあります。テレビはMPlayerでも観れるので、テレビ視聴用にxawtvは 必須ではないのですが、キャプチャカードを直接制御するv4lctlは何かと重宝します。xawtvは、rpmが 普通にあるものなので、インストールは簡単でしょう。むしろ、個々の環境で異なる設定ファイル(.xawtv) の作成の方が面倒だと思います。このビデオサーバのアンテナ入力は、iTSCOM(旧東急ケーブルTV)なので、あまり 汎用性はないと思いますが、とりあえず、当ビデオサーバの.xawtvです。

以下は実際にLAN内のビデオサーバで使われているシェルスクリプトです。たぶん、汚くて見てもわからないし、参考にもならないとは思いますが、実働例と いう意味で公開します。名前のmenatは、単にmencoder+at程度の意味です。その他の部分は、場当たり的にいい加減につけたもので、今さらな がら後悔しています。

このビデオサーバでは、menatというユーザが作られ、そのホームディレクトリでほとんどの作業が行われています。実例として、 /var/menat/himawari.karing.jp/menat/以下に予約録画のためのファイルが作られます。/var/menat/himawari.karing.jp/menat/はメインサーバの sambaによる共有(smbmount)です。この実行ファイルは、200412120100.w.mtqというような12桁の数字と拡張子からなるファイル名を持ち、予想通り、 その12桁の数値がキャプチャ開始時刻になっています。この実行ファイルがatdに登録され、指定の時刻にキャプチャが開始されます。

本質的にこのビデオサーバは、ビデオサーバと言うより、web上から利用可能なatdに過ぎません。ですので、実行ファイルに録画予約ではなく別な実行 ファイルを読ませてやれば、普通に動いてしまいます。このビデオサーバは、対象のディレクトリを監視しており、そこにこのビデオサーバのフォーマットに沿った正しい実行ファイルがあれば、単にそ れをatdに登録しているだけですので、cgi経由でなくとも、共有ディレクトリやftpなどとにかく普通にファイルを作れる環境があれば利用可能です。

実は、このビデオサーバは、web上から利用可能と言うことで、web上から複数のユーザが共用することも念頭に入れられています。ビデオサーバというも のをweb上で共用することにどういう意味があるのかは疑問もあるところでしょうが、技術的興味と思って頂ければ幸いです。

また、LAN内では二台のビデオサーバが動いており(himawariとnadesico)、各スクリプトは、それらを別のクライアントから統轄的に操作することを念頭において書かれているため、必要以上に複雑になっている部分があります。

以下のスクリプトを実行させるためには各種のパーミッションを正しく設定する必要があります。以下の例では /var/menat/public_htmlをcgiで操作するので、apacheにその権限を認めてやらなければなりません。ここまで読んでる人に とっては常識かと思いますが、/dev/video0など の パーミッションも考慮しないとキャプチャできないので気をつけましょう。

menat-sad.sh
ビデオサーバで実行され、予約登録情報を監視し、atdに登録したり、取り消したりする。また、loginしているユーザがいない か、httpdが使われていないかなど、ビデオサーバの利用状況を把握し、すべての条件が満たされるとシャットダウンする。本当は、cronで定期実行 する方がスマートかもしれないが、気分としてデーモンのように動かしたかったため、whileループで常駐している。

menat-cr.sh
キャプチャのための実行ファイル(シェルスクリプト)を生成するスクリプト。繰り返し録画の実装は、キャプチャ終了後、実行ファイルが次の実行ファイルを 自己生成するこ とによって行われている。一つの予約に一つのファイルを作る方針の真髄。また、この実行ファイルには、キャプチャに関するさまざまな情報が書き込まれ、何 がどのように行われたか、わかるようになっている。

キャプチャスクリプトの一例
かなり長いが、実際は単純にmencoderを起動させるだけのスクリプトに過ぎない。冗長なのは、下手の長糸と言われてもしかたのないところである。

menat-web.cgi
メインサーバの共有スペースにアクセス可能なホストのwebサーバで実行できる予約登録用cgi。単純には、共有ディレクトリにある録画予約ファイルを 表にして表示する。とにかく誤った予約を実行しないよう気を使ってくれるが、おかげで非常に重いcgiスクリプト。作るのにもっとも労力を費されたスクリ プトでもある。単純なiEPG対応のみならず、任意の時間と放送局から放映中の番組を探し出し、そのiEPGデータを表示することもできる。ちなみにVine 2.6のbash-2.05.0では、十桁までの算術比較しかできないことを知らず、12桁の算術比較を多用し、たいへん難儀した。このため、結局、 2.6への対応は放棄した。

menat-less.cgi
各予約録画の実行ファイルをweb上から参照するためのcgi。cgiは各機能で分散させる方針だった最初の頃の名残り。後にcgiは、menat- web.cgiに一元化することにしたため、単機能なcgiはこれだけになってしまった。一元化した理由は、cgiはcgiそのものを増やすより、 QUERY_STRINGを長くした方がかっこいいかな…と思ったからという単純な理由。

menat-vs.cgi
ビデオサーバ上の録画ファイルの一覧を表示するcgi。ダウンロード、ファイルの削除などをここから行う。mpegやwmvならストリーミング再生も可能 だが、それは、この cgiのおかげではなく、apacheのおかげ。圧縮中は、推定終了時刻等、圧縮に関する詳細情報を表示する。ちなみにキャプチャ中は、サービスを制限す る

menat-cmp.sh
予約録画で圧縮オプションが指定されたとき、キャプチャ後、圧縮を行うスクリプト。単なるmencoderのwrapperに過ぎないが、web上の cgiから渡される変数等をわかりやすく処理するためには必要。また、圧縮は非常に時間のかかる処理なので、キャプチャスクリプトは圧縮処理の終了 を待たずに終了するようにした。このため、圧縮終了時刻等、各種情報を管理するにはスクリプトを分離する必要があったのである。

menat-mail.sh
キャプチャ、圧縮が終わると、その結果についてmailを出す。個人的にmailが使える環境では常にwebも利用可能なので、mailは不要とも思ったが、手慰みである。一例として、キャプチャ終了時には、こんなメールが来る。

menat-wol.sh
メインサーバで実行されるWOLツール。cronにより管理され、メインサーバ上の予約録画状況を調べ、予約時間が迫っていれば、停止中のビデオサーバを 起動させる。現在は、10分毎に予約状況を確認し、30分以内に予約録画があれば、対象のビデオサーバをWOLで起動させる。

menat-tk.sh
キャプチャが定刻に開始されるとmencoder起動のタイムラグのため、わずかに出遅れるので、ビデオサーバの時計は、多少(1~2秒)、早めることに した。cronで、一時間二回調整している。

menat-iepg.sh
mozilla用iEPG対応plugin。個人的には、iEPGなど使わないが、対応できないと思われるのもシャクなので。Edit -> Preferance -> Helper Applications から、MIME type "application/x-tv-program-info"でmenat-iepg.shが実行されるように設定する。iEPGのファイルを読み込むと そのデータにセットされた録画予約ページが開く。

menat-progchk.sh
iEPG情報を参照し、各予約の時間変更などを監視している。変更等があった場合には、メールで知らせてくれる。また、その他のスクリプトがiEPG情報 を利用する際に使用されるため、通常のコマンドとしてiEPGデータを出力させることも考慮されている。通常、iEPGデータは開始時間や番組IDなどを正確に指定しな いと取得に失敗するが、このコマンドは任意の時間に放送中の番組を探し出し、その番組のiEPGデータを取得することができる。

おおまかな流れは、web上から、menat-web.cgiでキャプチャ用の実行ファイルを作成すると、menat-sad.shがそれをatdに登録し、atdからその実行 ファ イルが実行され、キャプチャが始まります。キャプチャ終了後、圧縮するように指定されていれば、menat-cmp.shでそのファイルを圧縮し、終了す ると shutdownを管理するmenat-sad.shがその他の条件も考慮し、条件がそろえばビデオサーバをshutdownします。

5. ビデオサーバマニュアル

こ こで紹介しているビデオサーバを使う場合のマニュアルです。実際には個人でしか使わないので、マニュアルなど無意味ですが、まぁ、洒落です。 Pentium II 333MHzのメインビデオサーバ(himawari)を念頭に書かれたものなので、サブ機、nadesicoより自由度が低めに説明されています。

karing.jp web録画予約について


6.実際のキャプチャ におけるtips

ビデオサーバに大切な物
ビデオサーバの性能を左右する最大のものはマシンスペックではありません。アンテナです。前述した通り、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にやらせても、二倍強の時間がかかります。


7.DVD化

TVキャプチャのついでにDVD化にも挑戦してみました。最も単純には、aviファイルをtranscodeでmpeg2にし、 dvdauthorでオーサリング、最後にgrowisofsでDVD-Rに焼き付けて完成です。mpeg2エンコードも、mencoderを使いたいと ころなのですが、なぜかうまくいかないので、しかたなく、transcodeでエンコードしています。しかし、transcodeは遅いですね。適当なフィルタをかませて実行させるとCeleron 850MHzでも6~10倍の時間がかかります。ただ、mencoderは仮りに使えても、速いかわりに互換性の問題が出たりするらしいので、DVDとかは transcodeでのんびりやるのが確実です。

transcode -v
transcode v0.6.12 (C) 2001-2003 Thomas Oestreich, 2003-2004 T. Bitterberg

transcode -Z 640x480 -I 5 -J pp=de,hqdn3d -i hoge.mjp -y mpeg -F d,0,dvd.prof -o hogeout

-Zはリサイズ、-Iはデインターレイス、-Jはフィルタオプションです。フィルタは、mplayerと同一のフィルタを使えるも のもあり、最善ではないかもしれませんが、慣れから同じフィルタを使っています。個人的には、デインターレイスは、pp=lb(pp=lb/de)でやっ てしまうのが通例です。フィルタは入力ファイルのフォーマットによって使えるものが制限されます。詳細はmanを参照のこと。

-iは入力ファイル、-yで変換後のコーデック を指定し、-Fでそのコーデックのオプションを指定します。d,0,dvd.profのdはdvd用であること、二番目のパラメータは解像度の変更で、こ こでは、0で無効化しています。最後のdvd.profは任意のファイル名で、DVDでは、このファイルでビデオビットレート を指定するようです。デフォルトは、9800kbpsが使われます。9800kbpsは高すぎなので、max_bitrate=4800000ぐらい にしておきました。-oは出力ファイルのベース名で、この場合、video.mpa(オーディオ)、video.m2v(ビデオ)の二つが作られます。

mpeg2エンコードには、-y mpeg2enc -F 8や、-y ffmpeg -F mpeg2も使え、こちらの方が高速で、transcode自身もこちらを使うよう推奨しているようです。ビットレートの調整は、mpeg2encの場合 は、-y mpeg2enc -F 8,"-b 2400"、こんな感じで出来ます(単位は、kbps)。ffmpegの場合は、./ffmpeg.cfgか ~/.transcode/ffmpeg.cfgの[mpeg2video]の項で調整します。

--ffmpeg.cfg--

[mpeg2video]
vrc_minrate=0
vrc_maxrate=9800
vrc_buf_size=1792
[mpeg2]
vrc_minrate=0
vrc_maxrate=3200
vrc_buf_size=1792

vrc_maxrate(kbps)がいわゆるビットレートです。ffmpegは、どうも-y ffmpeg -F mpeg2では、音声を出力しないようなので、-y ffmpeg,raw -F mpeg2 -N 0x50 -m hogeout.mpa(0x50はmp2)と明示してやった方がいいかもしれません。エンコード速度は、ffmpeg>mpeg2enc> mpegでしょうか。画質に特筆すべき差はないと思います。それらのオプションは、ffmpegやmpeg2enc(mjpegtools)に依存してい るので、それらを使いたい場合にはビルドやインストール時に気にかけてやる必要があります。もっとも、それらがないとtranscodeのmake自体が通らないかもしれませんが。

transcodeのデフォルトの音声は、mp2ですが、これをDVDでより一般的なAC3にしたい時は、-y mpeg,raw とし、-N 0x2000を指定します。0x2000がAC3を表しています。0x50がmp2、0x55がmp3です。そして、音声の出力先を-mで指定します。

transcode -J pp=lb/de,hqdn3d -i hoge.mjp -y mpeg,raw -F d,0,dvd.prof -N 0x2000 -m hogeout.ac3 -o hogeout


と、一通り、transcodeのmpeg2エンコードについて書きましたが、実は、v0.6.12以前だとこれだけではうまくいきません。 mencoderのmjpegでキャプチャした場合、内部的に1024MBごとのまとまりに分けられており、上記のやり方では、transcodeは、そ の最初の1024MBだけしか認識してくれないのです。上記の手順でも、1024MBを越えないファイルでは問題がないのですが、320x240でも30 分の番組をキャプチャすると1024MBを越えることはまれではないので、実際のキャプチャを考えると、transcodeを実行する前にもう一手間、必 要です(transcode v0.6.14では、このindexの問題は解消されたようですが、うちの環境のv0.6.14では、ppフィルタを使うと不正な命令だと怒られてしまうの で、使っていません)。

aviindex -n -i hoge.mjp -o hoge.index

transcodeが正しくindexを認識できないときは、aviindexで、transcodeにも正しく認識可能なindexを再構成してやりま す。こうしてできたindexを--nav_seekで、transcodeに教えてやります。hoge.mjpがtranscodeにどう見えているか は、tcprobe -i hoge.mjp でわかります。

transcode -I 5 -J pp=de,hqdn3d -i hoge.mjp --nav_seek hoge.index -y mpeg -F d,0,dvd.prof -o hogeout

映像と音声、二つのファイルができあがったら、そ の二つをtcmplexで、hogeout.mpgにまとめます。tcmplexは、NTSCファイルを正しく認識することができないようなので(自動認 識に 任せるとPALになる)、-Nで、NTSCであることを教えてあげます。-iで映像、-pで音声の各ファイルを指定します。-m dは、dvd用であることを示しています。aviindexとtcmplexはtranscodeに含まれているツールです。

tcmplex -N -o hogeout.mpg -i hogeout.m2v -p hogeout.mpa -m d

mpeg2のファイルができあがったら、そのファイルをDVD用にオーサリングします。

DVDAuthor::dvdauthor, version 0.6.10.
Build options: gnugetopt magick iconv freetype

dvdauthor -o dvd/ hogeout.mpg
dvdauthor -T -o dvd/

-oが出力先ディレクトリです。dvdauthorは、メニューの作成や チャプター分けなど、いろいろできるそうですが、個人的に必要じゃないし、面倒なので、ここではパスします。複数のファイルを入れる場合は、同じディレク トリに向けて同様の操作を繰り返します。hoge1.mpg、hoge2.mpg、hoge3.mpgを含むDVDを焼きたいときは、以下のようにしま す。

dvdauthor -o dvd/ hoge1.mpg
dvdauthor -o dvd/ hoge2.mpg
dvdauthor -o dvd/ hoge3.mpg
dvdauthor -T -o dvd/

transcodeの-y ffmpegで、mpeg2ファイルをつくった場合、dvdauthorはアスペクト比を自動検出できないようなので、教えてやる必要があるようです。こ こでは日本でのTVキャプチャの話なので、アスペクト比は4:3、-v 4:3を付加します。

dvdauthor -o dvd/ hogeout.mpg -v 4:3
dvdauthor -T -o dvd/

dvdauthor -Tでオーサリングが終わったら、後は焼きます。とりあえず、DVD-Rで試してみました。

growisofs -dvd-compat -Z /dev/cdrom -dvd-video -udf dvd/

で、一応できたようです。PCのDVD(HITACHI LG GSA-4082B)、mplayerでは、ちゃんと再生できました。まぁ、作ったソフト、ハードで再生できなかったら問題ですが…。残念ながら、家電の DVDプレイヤーは持ち合わせていないので、本当にDVD-Videoとして使えるのかは未検証です。また、ここで取り上げたDVD化の方法は、あくまで わかりやすい一例を目指したものであって、最善を求めたものではないことをお忘れなく。ついでに言うと、ここでは、Vineを使っていると書きましたが、 Vineはマルチメディアに弱いので、けっこうソフトのインストールには戸惑うかも…。使っておいてなんですが、Vineはマルチメディア用にはお薦めし ません。

とりあえず、transcode、dvdauthorをVine 3.1に入れてみる(dvd+rw-tools(growisofs)は、aptでインストールできます)。

で、DVD化をやってみた感想としては、こんなことに関わるんじゃなかった…です。自分にとって無意味であることを証明するためだけに膨大な労力を費して しまったと非常に後悔しています。DVD化なんてことを考えず、MPlayerの中に引きこもっていれば良かったと溜め息が出ました。mencoderは 速いし、ノイズの抜けもいいし、(慣れてるだけかもしれませんが)安定してるし、mencoderでdivxにして、PC内で完結させるのが、最も満足で きる視聴環境だと実感しました。別に録画したものを残しておこうなんて思わないし、DVDは、DVD-RAMの一時領域としての働きだけで十分かなぁ、っ てな感じです。

transcode エンコーダーソフトtranscodeの公式サイト。
dvdauthor DVDオーサリングソフトdvdauthorの公式サイト。
dvd+rw-tools growisofsを含むdvd+rw-toolsの公式サイト。dvd+rw-toolsは、その名前とは異なり、DVD-R,-RW,+R,+RW, -RAMに対して有用なユーティリティツールです。

8.まとめ

今や、HDDレコーダも安価になり、パソコンでビデオサーバを構築することにどれほどの意味があるのか、また、手間をかけただけの満足が得られる のかどうかは、もはや微妙です。手間暇、その他を考えれば、家電のHDDレコーダの方がコストパフォーマンスが上なのではと思うこと もしばしばです。市販品に存在する理不尽な制限も、長いものには巻かれろと唯々諾々従うのが大人の態度というものでしょう。

と、まぁ、パソコンでのビデオサーバ構築は、必ずしも賢い選択ではありませんが、とにもかくにも、ビデオサーバ構築によって、録画予約などのインターフェ イスを完全に自分好みにできたことは、それだけでも自分にとっては十分意味のあるものだったと自己満足しています。

ところで、あなたはこのページに何を期待しましたか?おそらく、その期待は見事にはずされたことと思います。ビデオサーバの構築は日常の雑事を単に自動化 するだ けのおもしろみに欠けるモノな上、環境、用途に依存するため一般化が非常に難しく、単純な解答、解決法を提示することがとても困難です。このページでは、 解答を一般化する試みは最初から放棄しています。検索かなにかでこのページにたどりついた人の多くは、おそらく、なんらかの解答を求めてここに辿り着いた ことと思われますが、明確な解答を用意できず、申し訳ない思いでいっぱいです。しかし、何卒、事情をお察しくださいませ。せめて、私の試行錯誤をおもしろ がっていただけたならば幸いです。


最終更新日 2005月1月24日
yoshino@rita.karing.jp

index.html 一つ戻る