![]()
玄箱で地デジ録画サーバー
以前紹介した通り、現在下の写真にある玄箱HGとPC-MV7DX/U2でアナログ放送録画サーバーを運用しています。
大変便利で重宝しているのですが、そろそろ地デジ対応をしようと思い立ちました。
条件は以下の通りです
1. 録画した場番組はリビングのテレビ、自宅LAN上のPCの全てで視聴可能であること。
2 .番組表を利用した予約が可能であること。
3. 繰返し録画(毎日、平日、毎週)に対応していること。
以前は条件1を満たすソリューションはなかなかありませんでした。一応DLNAという規格が存在しネットワーク上でのデジタル放送の録画番組の共有ができるのですが、対応している機種が殆ど無く、今後も広く普及しそうな気配はありません。
ところが最近、地デジの放送内容をさまざまな機器で再生可能な形でハードディスクに保存する方式が開発されてきました。これであれば条件1はクリアです。特に我家で使用しているREGZA
Zシリーズはネットワーク上で共有されているTSファイル(デジタル放送で利用されている方式)を再生することができるので、形式変換をすることなくリビングのテレビ、ネットワーク上のPCでの再生が可能です。
また、我が家でも利用しているMovieCowboyを利用して再生することもできます。
調べてみると低消費電力の玄箱PROとの組合せで地デジ録画サーバーが構築できるようなので、早速購入しました。1テラバイトのディスクも8千円で購入できましたので、高画質高容量の録画にも対応できそうです。地デジチューナーはQRS-UT100Bを購入しました。
そろえるものは以下の通りです。入手困難なものはオークションを利用すると良いと思います。
以上で必要な物の準備は完了です。
ついで、環境を構築します。「玄箱PROの本
」が大変参考になります。この書籍では別の地デジチューナーを使用していますが、ベースとなるDebian Linux Lennyのインストールや、番組表で録画が可能なVRSの導入などはQRS-UT100Bを利用する場合も同じ手順で実施できます。
以下に簡単に手順を記します。
実際に環境を構築してみると一応動作はするものの、以下の問題があることが分かりました。
録画が安定しないのは致命的です。早速チューニングを行います。調べてみると録画状態になるとCPUリソースがかなり逼迫していることが分かりました。この状態で他の処理を行うとデータの取込が間に合わずに異常終了してしまいます。チューニングポイントは以下の 4箇所です。
rsyslogdからsysklogdに変更する
Debian lennyをインストールするとrsyslogdが起動されるようになります。rsyslogdは高機能な反面、メモリを多く消費する様になります。地デジ録画サーバーとしては高機能は不要なので、以下のコマンドでsysklogdに変更します。
apt-get install sysklogd
この対処をした上で、録画用のバッファを増やします。
recfriioのソースコードを修正しバッファサイズを大きくする。
この変更については「玄箱PROの本
」に載っています。バッファがあふれると異常終了することになるので、バッファの設定を10秒から20秒に変更しました。大きくするといっても、所詮玄箱PROのメモリは128Mバイトしかないので、これ以上大きくしても無意味かと思います。変更内容は以下のとおりです 。変更後は再度コンパイルする必要があります。
setting.hppのASYNCBUFFTIMEを20に変更
const unsigned long ASYNCBUFFTIME = 20UL
録画中は他の処理が起動しないようにする。
録画開始前に録画した番組を視聴するためのsamba、番組表から予約をするためのlighttpdを終了させることにしました。これにより録画中は再生や予約操作が行えなくなり、一昔前のVHSレコーダ並みの操作性になってしまいますが、私の用途からすると大きな問題ではありません。
具体的にはdo-record.shを以下のように変更しました。
$RECFRIIOの行をはさむように、デーモンの停止と起動を入れます。
sudo /etc/init.d/lighttpd stop
sudo /etc/init.d/samba stop
sleep 1
$RECFRIIO ・・・・・・・・
sudo /etc/init.d/samba start
sudo /etc/init.d/lighttpd start
録画に使用するファイルシステムをext3からext2に変更する。
現在標準的に使用されているext3は信頼性が高いのと引き換えに、処理は重めとなっています。今回の用途を考えると、信頼性は重要ではないのでext2に変更しました。ちなみに、処理が軽くなると言われているext3のwritebackモードも試したのですが、全く改善が見られませんでした。どうやら大量の書込みをシングルで行う場合はwritebackモードの効果は無いようです。 変更方法についてはDebianの解説書等を参考にしてみて下さい。
あとは「玄箱PROの本
」の通りですが、b25による復号化は同時実行は行わず、niceで優先度を最低にして録画後に実行するのも重要です。
以上の対処で異常終了することはなくなりました!!!
さて、次はファイル名に番組名を入れます。そもそも今回利用させて頂いたVRSが多くの市販製品と異なりファイル名に番組名を入れていないかという点にふれておきたいと思います。以前読んだ開発メンバーの方のコメントによると「日本語環境が利用者個々に
異なるるので、統一的なコードでの配布ができなくなる。また、ファイル名に使用できない文字が番組名に含まれている場合の処理が複雑化する。」とのことでした。もっともな話です。日本語環境はOS(Debian
Lenny),samba,VRSそれぞれに存在し、整合が取れていないと文字化けしていしまいます。
私の場合、玄箱PROは地デジ録画専用とすることにしたので、vrsで採用されているEUCコードに全てを統一することにしました。具体的には以下の通りです。
linuxのデフォルトのlocaleをEUCに設定
localesをインストールしていなければ
apt-get install localesインストール済みであれば
dpkg-reconfigure localesでデフォルトのlocaleをja_JP.EUC-JPにします。
sambaの設定でサーバ側をEUCに設定(クライアント側はCP932)
/etc/samba/smb.confの中を以下の様に修正(不慣れな方はSWAT利用を推奨)
[global]
dos charset = CP932
unix charset = EUCJP-MS
display charset = EUCJP-MS
あとはReservation.phpを以下のように修正すればOKです。変数に格納されている番組名はURLエンコードされているのでデコードする必要があります。さらにファイル名に使用できな文字に対する対処については個別に対応するのではなく、全て全角に変更してしまうことで対処しています。
修正前:
function getOutputName()
{
return date( "Y-m-d_H-i", $this->startTime_ )."_{$this->captureDevice_}";
}
修正後:
function getOutputName()
{
return mb_substr(mb_convert_kana(urldecode($this->title_),"RNASKV","EUC-JP"),0,50,"EUC-JP")."_".date( "Y-m-d_H-i", $this->startTime_ );
}
なお、ファイル名の重複を防ぐために末尾に録画日時を付加しています。
使ってみるとこれは大変便利です。LANさえ繋がれば家の中どこでも視聴可能ですし、屋外の無線LAN経由のノートPCでも視聴可能です。
しばらく部屋内で運用して、安定しているようであれば一階の天井裏に装置ごと入れてしまう予定です。光ディスクを利用しない方式なので、部屋においておく理由は特にありません。
残った課題は繰返し録画機能の実装です。とりあえず「毎日」、「月-金」「毎週」が実現できれば問題ないと思います。これには様々な方法があります。予約時に繰返しパターンと回数もしくは終了日を指定する方法もありますが、テレビの繰返し録画の場合は回数や終了日がよく分からない場合も多いでしょう。したがって、繰返し指定がされている録画を行う際に、次回分を自動予約するというのが順当な方式かとおもいます。vrsでは手動で予約を行う機能も提供されているので、その機能を利用して次回分の自動予約をすればよいことになります。
phpではcgi用に作成したスクリプトをコマンドラインからも起動することができますので、録画を開始するスクリプト内で次回の録画予約処理を行うこととします。
(現在時間不足もあり構築中です。続きは後日アップしたいと思います。)
最後に・・・
今回の件でわかったのは玄箱PROはその低消費電力に見合った非力な機械だということです。アプリによっては玄箱HGのほうが高い処理性能がでるもようです。ただし玄箱HGはカーネルの入れ替えが危険もしくは面倒。現在、玄箱HGではアナログで録画サーバーを運用していますが、2011年にアナログ放送が終了したら、デジタル版に再構築する予定です。
サイトのトップへ戻る
![]()