Linuxで最強のテレビ録画サーバを目指す【5】-Web録画インターフェイス-

['04/11/07] ivtvwebrecアップデート
['04/10/16] 初稿
■はじめに
■とりあえず録画
 こちらのページで解説したように,Linux で行う TV録画の必要充分な下地が整いました.ゴーストリデューサーや3次元Y/C分離も行える ようになった関係で,近年爆発的に売れているとの話をよく聞く『DVDレコーダ』と比べて 遜色が無い画質でのキャプチャが行えるようになりました.

 しかし,これはあくまでもドライバレベルの話です.一応 record-v4l2.pl という コマンドがドライバに同梱されて配布されており,コマンドを叩くことにより録画を行う ことが出来るとは言え,使い勝手という面では家電には太刀打ちできません.そもそも record-v4l2.pl は録画予約を行うコマンドではないため,指定時間になったら自動的に 予め定められた設定通りに録画を開始する仕組みが必要となります.

 そこで私は こちらのページで解説したように,at と連携させて 予約録画を可能にし,長らく使用してきました.ここ数年,私はあまりテレビを観る 時間が取れないこともあり,それほど多くの予約を入れていなかったため,これはこれで 問題なく利用できていました.

 しかし,現在あまり元が取れているとは言えない状況である :-) 『WOWOW』の番組表や,嫁さんが買ってきた 『TVガイド』をパラパラとめくっていると,なにげに面白そうな映画や番組が並んでいます. 『どうせ観る時間無いから…』と,いった非常に消極的なことではなく,『撮っておけば いつか観るかもしれないし』というやや積極的(?)な態度で番組表を読むようになりました.

 こう考え始めると,アレもコレも撮っておこうという気になり始めます.そうなると 自ずと録画予約件数が増えます.連鎖的にコマンドラインでの録画予約のインターフェイス が途端に使いにくく感じ始めます.特に録画開始日時や時間の指定を数字で入力するという のは非常に煩雑かつ直感的ではなく,事故の元です.実際,日にちを間違えて予約してしま い,別番組が録画されていたことも….

 ちなみに こちらのページでは,色々と ivtv ドライバのフロント エンドとしても使用できるソフトが存在している/出てきているということを書きました. 例えば代表的なものに, vcr(ivtvで使う場合はパッチが必要), mbrTVMythTV等があります.何れもグラフィカルな インターフェイスを持ち,Web等で録画予約を入れることが出来,iEPG にも対応している ものもあります.これらの他にもいくつか試してみましたが,少々私のニーズに対しては 高機能すぎる感じがし,また,一度環境を作ってしまえば快適と言えるものの,環境構築が かなり手間なものもありました.そしてWeb をアレコレ散策していると,やはり似たような ことを感じている方も多々おられる様子.

 と,このような経緯がありまして,以前宣言していて結局着手していなかった『Webを利用 した録画予約インターフェイス』を作ることにし,"ivtvwebrec"などという神をも恐れぬ 大それた名前で :-) 公開することにました.

# 当初は『hogehoge.cgi』とかいう名前を使っていたのですが, 『その "hogehoge" ってなんやねん』というツッコミがありまして,名前は急いで 適当に付けました.もっとかっちょよくて意味が通じるマトモな名前にしようかなぁ.

■開発の流れ
■基本的な開発方針
 さて,実際にはじっくり仕様を検討してから作り込んだわけではないのですが, 今回開発するに当たっていくつか念頭に置いていた事柄があります.
  • 超高機能な重厚長大なものを目指すのではなく,基本的な機能のみを押さえたものにする (自分で常用してみて不満が無い程度の機能&インターフェイスにする)
  • 1つの大きなプログラムにするのではなく,他の人が手を入れたり,一部使い回したり することを容易にする目的で,小さなログラムの組み合わせで動く形にする
  • 設定やインストールが煩雑な外部コマンド/ソフトは極力使用しない
  • C言語は使用しない.スクリプト言語を使う(スクリプト言語の方が使える人の人口が多いため)
  • 情報管理は SQL ベースの DB を使用する
 大雑把に要点をまとめると,出来るだけ簡素なものにし,他の人が使う/改造する際に 作業が出来るだけやりやすいようにしようということです.

 一般にDBと連携するようなWebベースのアプリを作る場合は,PHPを使うことが多いと 思います.しかし,versionの違いや設定の違いによって,同じスクリプトが動いたり 動かなかったりする他,プログラマ人口は perl の方が多いかなと考え,基本的に シェルスクリプトとPerlで組むことにしました.なお,フロントエンドを PHP に置き 換えることも容易にするため,バックで動く部分は切り離して実装してあります.

 また,情報管理はファイルに書き出したものを使用しても良いのですが,データの使い 勝手を良くするために, DB を使用することにしました.また,この手のソフトでは DB として MySQL や PostgreSQL を使うのが一般的ですが,これもまた初心者には環境構築が やや敷居が高い場合があるかと考え,SQLite を使用することにしました.なお, Perl から DBI 経由で呼んでいるだけですので,MySQL 等にしたい場合は容易に 変更出来ます.

■実装した機能
 さて,家電並みの使い勝手を得るというよりも,TVの予約録画ためには, 最低限以下のような機能を盛り込む必要があるでしょう.

  • 録画の予約
  • 予約の取り消し
  • 録画リスト/予約リストの一覧表示
  • 録画物の削除

 ごくごく一般的なものばかりです.逆にこれらが満たされていなければ,マトモに使える ものではないと言って良いでしょう.問題は,これらの設定方法や見せ方,設定項目等により ソフトの出来不出来が決まってくることです.

 ivtv ドライバは実に多くの設定項目が存在し,record-v4l2.pl や test_ioctl を用いて 設定が行えます.しかし,多くの人がこれらを一通り必要とするとは考えにくく,多くの人は 『タイトル』,『録画日時』,『録画時間』,『ソース(チャンネル等)』,『画質』があれば 最低限の所はクリア出来ると思います.必須入力項目が減ると言うことはそれだけ扱いやすくなる ということですので,歓迎されるべきことです.その他の設定はデフォルト値を用意し,拡張設定 用のインターフェイスを用意すれば良いでしょう.実際,DVDレコーダ等もこれら項目の入力に 止まっているものが大半です.

 では次に,家電ではなくPCで録画するからこそ実現出来,かつ,盛り込みたい機能に関して 考えてみます.

 既に MPEG2 ハードウエアエンコーダを搭載したキャプチャカードを 利用している人でしたらお分かりになると思いますが, MPEG2形式で録画した場合,そのファイルサイズは膨大なものになります.例えばDVD-Videoクラス の高画質(8[Mbps])で録画した場合,1時間で 3[GB]近くもの容量になります.この画質で毎週1時間 物のドラマを4本録画し,さらに週に3回 2時間物の映画や番組を録画した場合,1週間で消費する ディスク容量は30[GB]もの容量になります.ドラマのワンクールを(少なく見積もって)10話とし, 10週間撮り続けたら300[GB]になります.実際にはビットレートを落としたりして容量を節約すること になると思いますが,それでもかなりの容量です.

 HDD付きのDVDレコーダを使用していた場合は,『HDDが溢れる前に DVD-R/RW/RAM に書き出すか, 観た物をどんどん消していく』ことでこの問題に対処するわけですが,はじめに書きましたように, 私の場合は時間的な制約があり,あまりハイペースで消化していくことが出来ません. つまり,どんどんディスクに溜まって 行ってしまい,うっかりしていると,ある日急に空き容量不足で録画失敗という事態に陥ります.

 PCの場合はディスクをガンガン増設して容量を増やすことにより,この問題を凌ぐことが 出来るわけですが,未だディスク容量はGigaByteクラスのデータを潤沢に格納するほど大容量 ではありません(と,個人的には思っています).そのため,増設作業や消化作業が自転車操業 になってしまい,本質的な問題解決にはなりません.そこで PC ならではということで, より高圧縮率かつ画質もそれ程 落とさない形式にコンバートすることにより,容量問題の改善を図ることにしました.

 コマンドラインから直接録画予約を入れていた頃は,コンバート作業も録画終了を見計 らって手動で行っていました.そして気が付くと大量に未コンバートとなっているファイルが あり,DivXへ変関するジョブを走らせたら CPU 利用率 100% が1週間続いたなんてこともあり ました(図1).コンバート中も録画ファイルがどんどん溜まっていき,空き容量の逼迫をグラフで 眺めながらヒヤヒヤしていたものです(図2,図3).


図1 CPU使用率の推移
(平均されるため,CPU使用率が 100% で数時間推移した程度ではバーが上に張り付かない.
"user"で高い使用率が出ている部分は DivX でのエンコードをマニュアル操作でしていた部分.
"nice" でそこそこ高いものが出ている 部分は,今回紹介する ivtvwebrec で録画後にエンコードされるようにした以降の物)


図2 "/" パーティションの使用容量の推移

 
図3 その他のパーティションの使用容量の推移
(録画データの待避にも利用している)

 そこで高画質で残したいものはそのまま残すことにし,それ程画質を求めないものは録画 終了後に別形式に自動的にコンバートするようにしました.コンバートを行うか否か,どの 形式でコンバートするかを録画予約時に設定しておけば,この作業を忘れて冷や汗をかく こともありません.また,コンバートが適時行われるため,連続して大量の録画を行わない 限り,負荷が集中して長期間 CPU が回りっぱなしという状況を避けることが出来そうです. (余談ですが,CPU負荷の高いときにも録画はコマ落ち無しで行われます.こういった所は, MPEG2ハードウエアエンコーダ搭載カードが持つ,ソフトエンコカードに対する強烈な アドバンテージでしょう).なお,今回リリースした版では,事故を防ぐために, コンバート後のMPEG2ファイルの削除は自動では行わないようになっています.

 次に CX23416GYC-STVLP を使用している場合にのみ関係してくる話ですが,このカードを 使用してキャプチャした物を PC で閲覧すると,上部にチラチラとノイズのようなものが見える と思います.これは VBI と呼ばれる文字放送等に使用されている領域で,CX23416GYC-STVLP で使用している SAA7173 では,キャプチャしないように設定出来ませんでした (今のところ問題解決の光明は見えていません.しかし,いずれは FIX できると思います).

 元々,TVで視聴した場合,上下左右の数ラインはTV画面上に表示されません.そのため,例え ばMediaWiz等でこのキャプチャ動画をTVに再生した場合は見えなくなります.しかし,PC で 見る場合にはかなり気になることでしょう.そこでコンバートする際には上部数ラインを 黒で塗りつぶすようにしました.また,私の環境では,CATV チューナー経由で WOWOW をキャプチャした際に,左右に20ピクセル幅の白帯が入ります.これもTVで観た場合は 問題にならないのですが,PC で観たときに気になるので,これもコンバート時に 黒塗りすることにしました.(この調整値が適切でない人や,問題の出ないカードを 使用している人は,スクリプトを直してみて下さい)

■ivtvwebrec を使う
■録画の流れ
 インストール方法その他はパッケージ同梱のreadmeファイル内で説明していますので, 省略します.本ソフトを試してみたいという物好きな方は, こちらから 本体をダウンロードして下さい(11/30版はこちら). 6個のCGIと4個のスクリプトから構成されます.これらを動作させるためには この他にいくつかのPerlモジュールや外部コマンドが必要とされますので, これらは予めインストールしておいて下さい.

[04/11/07] バグが見付かったのでアップデートです(^^;

  • 過去の時間を指定した場合にエラーを表示するように変更
  • 予約を入れた物を削除するルーチンにミスがあったので修正(atジョブが削除出来てなかった)
  • その他若干修正

[04/11/22]アップしていたファイルが壊れていたので置き直しました
[04/11/30]細かなバグと環境依存の問題を修正
[04/12/05]細かなバグと環境依存の問題,修正漏れを修正. 基本的にDBはそのままでCGIやコマンドをupdateするのみで動くはずです.

 以下,簡単な操作の流れに関して説明します.

■録画の予約
 録画の予約を行うには,ivtvwebrec.cgi に Web ブラウザでアクセスします. すると図4のような画面が表示されますので,必要なデータを入力していきます. なお,録画時間(秒)と曜日に関しては,自動的に計算されて表示されますので 入力の必要はありません.


図4 録画予約画面
(クリックで拡大)

 入力が終わったら,『録画予約』ボタンを押します.するとivtvwebrec1.cgiが実行され, 図5のような確認画面が出ます.内容を確認して 問題がなければ『録画予約』を.修正する必要がある場合は『やり直し』ボタンを押して下さい. 『やり直し』を押した場合は ivtvwebrec.cgi の画面に戻ります.


図5 予約確認画面
(クリックで拡大)
 最後に ivtvwebrec2.cgi によって ivtv_web_rec.sh に設定されたパラメータが 渡され,ivtv_web_rec.sh が必要なコマンドに展開してから at キューにジョブが キューイングされます.実行後,図6のような画面が表示されます.ここで 何某かのエラーがある場合は『リターンコード』の表示内容が変ってきますので確認して下さい. 『ATジョブ番号』が普通に数字で表示されていたら基本的に問題なく予約がスケジューリング されています.


図6 予約完了画面
(クリックで拡大)

 なお,この画面が表示された時点で, DB への情報の登録も完了しています.

■録画の実行
 録画開始時間に到達したら,atd がキューイングされているジョブを実行します. ivtv_web_rec.sh によりジョブがキューイングされることは前述しました.これを より詳しく説明すると,『録画の実施』,『JPEGサムネイルの作成』, 『別形式へのコンバート』,そして各状態に遷移する際に実行される『DB上の ステータス情報の更新』コマンドに展開され,時系列に再配置されてキューイング します.

 録画はrecord-v4l2.pl を実行して行われ,録画完了後にmplayerを実行してJPEG サムネイルを作成し,これも完了した後に別形式へのコンバートが行われます. コンバート形式として VCD(MPEG1) 形式が選ばれていた場合は ff_mpeg2vcd.sh が実行され,このスクリプトから ffmpeg がパラメータ付きで呼ばれます. DivX形式が選ばれていた場合は tr_mpg2tompg4.sh が実行され,このスクリプトから, 同じくパラメータ付きで transcode が実行されます.そして各状態に遷移する際には, ivtv_web_rec_fin.pl が実行され,DB上のステータスフラグを変更します (例えば別形式へのコンバートが 行われる場合は,「未コンバート」→「コンバート中」→「コンバート済」といった 具合にDB上の当該レコードのフィールドの内容を各ステージを示す値に更新します).

 つまり,Web インターフェイスを使わなくても良いのであれば,(長々とパラメータ を羅列しなければなりませんが)ivtv_web_rec.sh をコマンドラインから叩いても構い ません.そして別の Web インターフェイスを被せたい場合は,皮だけ変更し,裏では このスクリプトを実行するようにすればOKです.

 また,コンバート形式を増やしたり変更したい場合は, ivtv_web_rec.sh, ff_mpeg2vcd.sh,tr_mpg2tompg4.sh に手を入れれば良いことになります.おそらく コンバート時のビットレート等のパラメータに関しては,人によって色々と調整 したいと考えていると思いますので,ff_mpeg2vcd.sh,tr_mpg2tompg4.sh に関しては 一度目を通しておくことをお勧めします.なお,これら2つのスクリプトは,コマンドライン からも実行することが可能で,既に存在するファイルをこれら形式に変換するために 利用することも出来ます.

 ちなみに録画の際のディレクトリ名やファイル名は record-v4l2.pl の デフォルト値が使用されます.つまり,MPEG2ファイルはvideo.mpgとして記録されます. そしてこれら2つのスクリプトで生成されるファイルの名前は,それぞれvideo.vcd.mpg, video.avi です.決め打ちになっているので気を付けて下さい.

■録画/予約内容の確認
 ivtvwebrec.cgi の『予約一覧』ボタンを押すことによって ivtvwebrec3.cgiが実行され, 録画/予約内容の確認が行えます(図7).


図7 予約一覧画面
(クリックで拡大)

 初期状態では録画予約が全て表示されますが,ページ上下に1箇所づつ設けられている プルダウンメニューから,表示内容を『全て表示』,『録画済みのみ表示』(図8), 『録画中のみ表示』,『待機中のみ表示』を選択することが出来,また,ソート順として 『時間順』と『タイトル』(図9)から選択することが出来ます.選択後,『表示切替』ボタンを押して下さい.


図8 「録画済みのみ表示」にした際の予約一覧画面
(クリックで拡大)


図9 「待機中のみ表示」で「タイトル」順にソートした際の予約一覧画面
(クリックで拡大)

 『JPEGサムネイル作成』を選択していた場合はサムネイルが表示されますが,今のところ 自動的に作成された1番目のJPEGファイルを表示します.この辺りはいずれ任意の画像を 選んだり,サムネイルを作り直したり出来るようにしようかなと考えています.また, サムネイル画像にはMPEG2ファイル,もしくはコンバートしたファイルにリンクが張られます. ただし,これら動画ファイルが 2[GB] を越えている場合は,JPEGファイルにリンクが張られます.

 Windows マシンをクライアントとして使用している場合,QuickTime と Plug-in が インストールされていれば,MPEG1 形式にコンバートしている場合はクリックすることによって ブラウザ上で再生出来る筈です.しかし,MPEG2やDivX形式の場合,ファイル全てをダウンロード後に 再生される形になるんじゃないかな.

■その他機能
 録画予約一覧表示画面の予約アイテムの右端に,それぞれ『操作』というボタンがあります. これをクリックするとivtvwebrec4.cgiが実行され,各予約アイテムの詳細な内容が表示されると共に, 『削除』(DBから予約情報を削除し,録画済の場合はディレクトリさら削除.待機中であれば atdのキューから削除),『タイトル変更』,『MPEG2ファイルのみ削除』が行えます(図10).

図10 『操作』画面
(クリックで拡大)

 なお, これらファイルの削除やDBの更新などの実際の実行は ivtvwebrec5.cgiによって行われます.

■まとめ
 約1月ほど運用してみましたが,至極安定して動作しています.短い開発時間にも 関わらず実用的なものが出来,我ながら満足度はそこそこ高いかも.

 これが稼働する直前は週に5番組以上2ヶ月近く予約していたこともあり,もっと 早く開発に着手すれば良かった…と,思うことしきり.予約の入力ミスが無くなり, また,録画後の手間(録画物の管理やコンバートなど)も大幅に軽減しました.その 反面,以前にも増して録画予約を気軽に入れることが多くなり,ディスク容量の逼迫 は頭の痛い問題です.

 次に来る話としては,『今後の展開は?』という話になるかと思いますが,欲を 言えばきりがなく,実現したい機能は山盛りです.しかし,おそらく私の方では,今後あまり 機能拡張することは無いのではないかと思います.『ワシがもっと良い物にしたる!』 と,いう方が現われてガシガシ改良して下さったり,これに触発されて,もっと良いものが 沢山出てきてくれれば嬉しいなと考えています.

# …いつものことですが,ふとモチベーションが極限まで高まり, ガーッとスクラッチから書き直す可能性が無いとも言えませんが :-)

 最後にこれを使ってみようと考えている方に対してですが,利用に際して 特に留意しておく点は,以下の3点です.

  • セキュリティ面では全く配慮していませんので,ドキュメントをよく読み, 何らかの対策をするようにしてください.何も対策を採らない場合は,他人から 勝手に予約を入れられたり :-) ,録画ファイルを削除されてしまったりします
  • エラー処理は殆ど行っておりません.ご了承下さい
  • 録画時刻の重複チェックを行っていません.普通にスルッと予約 できてしまいますが,重複していた場合は,後から開始する方がきちんと録画出来ません. (対策コードを入れていない現在の版では)予約登録後,予約一覧で確認するようにしてください.
 また,おきまりの文句ですが,ご利用は自己責任で.

『Asus Terminator 活用メモ』 へ戻る