家庭内TV視聴システム「きゃぷら~」

1.「きゃぷら~」の紹介

家庭内TV視聴システム「きゃぷら~」は、TVの無い部屋でもパソコンでTVを見られるようにしたいというわがままを
実現しようと思って考えたシステムです。(TV買えよ~って話をされるとつらいです。)
以下、「きゃぷら~」を導入する手順を説明します。

(last update 2006/04/20 監修 段.店裏)

2.「きゃぷら~」を構築するための環境について

最初に、筆者の自宅のPCの構成は以下の様になっています。

LAN
|
+---WindowsPC(デスクトップPCです。)
+---LinuxPC1(常時電源ONのノートPCです。 説明上IPアドレスは、192.168.1.10とします。)
+---LinuxPC2(MythTV用のデスクトップPC)
+---LinuxPC3(今回「キャプラ―」構築用に設置したデスクトップPCです。説明上IPアドレスは、192.168.1.11とします。)
+---WindowsPC(ノートPCです。このPCでTVを鑑賞したいわけです・・・)

常に電源が入ってるのは、LinuxPC1のみです。(スペックはMMXペンティアム166MHz・メモリー96MBです。)
今回はLinuxPC1とLinuxPC3を使用して「きゃぷら~」を構築します。

次に、「きゃぷら~」を構築する前提条件として以下が最低限必要です。
(必ず2台必要ではありません。PC単体でもOKです。)

☆Linux1は可能であればWebサーバーの機能を有すること(Perlは必須です。)
☆LinuxPC3にはVineLinux3.2がフルインストールされておりキャプチャーカード(SAA7133GYC-STVLP/R)が組み込まれていること
☆LinuxPC1とLinuxPC3はお互い通信可能になっていること
☆LinuxPC3はwakeonlanが可能であることが望ましい(必須ではないです。)
☆LinuxPC1とLinuxPC3はインターネットに接続出来ること
☆LinuxPC3で音が鳴ること
☆LinuxPC3のサウンドの音声入力とキャプチャーカードの音声出力がラインで接続されていること

ご参考までに、LinuxPC3の主なスペックは以下の通りです。
CPU:ペンティアム3-700MHz
Memory:512MB
HDD:30GB
キャプチャーカード:SAA7133GYC-STVLP/R(リモコン無しモデル)
かなりロースペックなPCですが実用上問題ありませんでした。

キャプチャーカードとOSが限定されているのでちょっと敷居は高いかもしれません。
キャプチャーカードは、玄人さんのHPによると今でも販売はしているようです。(リモコン有りモデルのようです。)
(でも、リモコンはLinuxでは使えないんでしょうか・・・)
リモコンの有無によってキャプチャーカードの中身が変わっているのかはわかりません。

(last update 2006/04/20 監修 段.店裏)

3.WakeOnLanの設定

LinuxPC1からMagicパケットを送信してLinuxPC3の電源をONにするために、LinuxPC1に
WakeOnLanのソフトをインストールします。
これにより、わざわざ電源ボタンを押すことなくPCを起動することができるようになります!
(LinuxPC3がWakeOnLanに対応していなければここはスキップしても構いません。)
逆にいうと、ブラウザからPCの電源がON出来るってことです!

最初に、アプリケーションをダウンロードします。
$ su -
# cd /usr/local/src
# wget http://gsd.di.uminho.pt/jpo/software/wakeonlan/downloads/wakeonlan-0.41-0.fdr.1.noarch.rpm

次にダウンロードしたアプリケーションをインストールします。
# rpm -ihv wakeonlan-0.41-0.fdr.1.noarch.rpm
# exit

最後にwakeonlanコマンドを使ってLinuxPC3を起動してみます。
$ wakeonlan -i 192.168.1.11 XX:XX:XX:XX:XX:XX

ここで、XX:XX:XX:XX:XX:XXはMACアドレスになります。MACアドレスはネットワーク機器に割り当てられている
固有の番号みたいなものです。(重複はありません。)

MACアドレスの調べ方

Windows系の場合、コマンドプロンプトにて
ipconfig /allと入力してPhysical Addressの部分が該当します。
(":"でなく"-"で出力されますので注意しましょう!)

Linux系の場合、
$ /sbin/ifconfig
を実行してハードウェアアドレスって部分が該当します。

うまく起動しましたでしょうか!?
起動しない場合は、BIOS等を調査してみましょう。ハードウェア的に対応していない場合もありますが・・・

(last update 2006/04/20 監修 段.店裏)

4.SSH接続(公開鍵方式)構築

本システム「きゃぷら~」では、TVのチャンネル変更をLinuxPC1からLinuxPC3に命令を指示することで
実現しています。これを実現するためには、SSH(公開鍵認証)が必要となります。
この章では、LinuxPC1からLinuxPC3に公開鍵認証を使用してログイン出来るように環境を構築します。
なお、既に公開鍵認証が実現できている方はスキップしてください。

以下の例は、LinuxPC1とLinuxPC3で同名のユーザーkaplerが存在するものとして記述しています。

まずLinuxPC3で鍵を作ります。
途中で質問がいくつかありますが、EnterでOKです。
$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/kapler/.ssh/id_dsa):
Created directory '/home/kapler/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/kapler/.ssh/id_dsa.
Your public key has been saved in /home/kapler/.ssh/id_dsa.pub.
The key fingerprint is:

続いて以下のコマンドを順に入力してください。
$ cat id_dsa.pub >> $HOME/.ssh/authorized_keys
$ chmod 600 authorized_keys
$ rm id_dsa.pub

同様にしてLinuxPC1でも鍵を作った後コマンドを入力してください。

さらに、LinuxPC1上から以下のコマンドを入力します。
$ scp authorized_keys kapler@192.168.1.11:~/auth.txt

LinuxPC3上で以下のコマンドを入力します。
$ cat auth.txt >> /home/kapler/.ssh/authorized_keys
$ rm auth.txt

ここまで終了したらLinuxPC1上からLinuxPC3にSSH接続してみます。

$ ssh kapler@192.168.1.11

パスワードを聞かれることなくログイン出来ればOKです。
ログインできない場合は説明をもう一度よく見直してみましょう。

最後にLinuxPC3のSSHの設定を変更しておきましょう。
(同様にしてLinuxPC1の設定も変更することをおすすめします。)

# vi /etc/ssh/sshd_config

#Protocol 2,1

Protocol 2

#PubkeyAuthentication yes

PubkeyAuthentication yes

#AuthorizedKeysFile .ssh/authorized_keys

AuthorizedKeysFile .ssh/authorized_keys
AllowUsers kapler
(↑は存在しないので追加してください。)

#PasswordAuthentication yes

PasswordAuthentication no

#PermitEmptyPasswords no

PermitEmptyPasswords no

sshdの再起動を行います。

# /etc/init.d/sshd stop
sshdを停止中: [ OK ]
# /etc/init.d/sshd start
sshdを起動中: [ OK ]

LinuxPC1上からLinuxPC3にSSH接続してみます。
$ ssh kapler@192.168.1.11

どうでしょう?先ほどと同じようにパスワードなしで接続できましたか?

(last update 2006/04/20 監修 段.店裏)

5.ffmpeg導入

この章では、ffmpeg導入を順を追って説明します。長くなりますが、落ち着いて作業しましょう!
(ffmpegを導入するのは、LinuxPC3になります。)

Linux環境を最新にします。
# apt-get update
# apt-get upgrade

xawtvをインストールします。
# apt-get install xawtv
さらにxawtvの設定ファイルを作成します。
(/home/kapler/においておきます。)
$ vi .xawtv (中身は以下のとおり)

なお、設定は関東の方であればそのまま使用出来ると思います。その他の地域にお住まいの方は適当に編集してください。
また、.xawtvファイルが自動的に作成される場合もあるみたいです。

キャプチャーカードを有効にします。
# vi /etc/rc.local

以下を追記してください。
/sbin/depmod -a
/sbin/modprobe upd64031a card=6
/sbin/modprobe upd64083 card=6
/sbin/modprobe saa7133gyc_stvlp debug=1
/sbin/modprobe saa7134 card=37 tuner=43 oss=1

soundとv41の権限を変更します。
# vi /etc/security/console.perms

soundとv41を660に変更してください。
(この先何か不都合があった場合は、666にしてください。)
# permission definitions
<console> 0660 <floppy> 0660 root.floppy
<console> 0666 <sound> 0666 root
<console> 0600 <cdrom> 0660 root.disk
<console> 0600 <pilot> 0660 root.uucp
<console> 0600 <jaz> 0660 root.disk
<console> 0600 <zip> 0660 root.disk
<console> 0600 <ls120> 0660 root.disk
<console> 0600 <scanner> 0600 root
<console> 0600 <camera> 0600 root
<console> 0600 <memstick> 0600 root
<console> 0600 <flash> 0600 root
<console> 0600 <diskonkey> 0660 root.disk
<console> 0600 <rem_ide> 0660 root.disk
<console> 0600 <fb> 0600 root
<console> 0600 <kbd> 0600 root
<console> 0600 <joystick> 0600 root
<console> 0666 <v4l> 0666 root
<console> 0700 <gpm> 0700 root
<console> 0600 <mainboard> 0600 root
<console> 0600 <rio500> 0600 root

再起動します。
# sync;sync;sync;shutdown -r now

リンクの張替えをします。
# mv /dev/video /dev/video.dir
# ln -s /dev/video0 /dev/video

ここでxawtvのテストをしてみるといいかもしれません。
Xを起動して、以下のコマンドを入力します。

$ /usr/bin/v4lctl setchannel 8
$ xawtv

どうでしょう?TVが表示されてサウンドも鳴りましたか?

nasmをインストールします。
# apt-get install nasm

ncurses-develをインストールします。
# apt-get install ncurses-devel

lameを取得してインストールします。
# cd /usr/local/src/
# tar zxvf lame-3.96.1.tar.gz
# cd lame-3.96.1
# ./configure
# make
# make install
# /sbin/ldconfig

XOrg-develをインストールします。
#apt-get install XOrg-devel

SDL-develをインストールします。
#apt-get install SDL-devel

ffmpegを取得してインストールします。(バージョンは0.4.8を激しく推奨します。)

最新版(CVS版)の取得の場合は以下の様にすると取得できます。
# cvs -z9 -d:pserver:anonymous@mplayerhq.hu:/cvsroot/ffmpeg co ffmpeg

解凍して出来たディレクトリに移動します。
# cd /usr/local/src/
# tar zxvf ffmpeg-0.4.8.tar.gz
# cd ffmpeg-0.4.8

コンパイルしてインストールします。(結構時間がかかります。気長に待ちましょう。)
# ./configure --enable-mp3lame
# make
# make install

/etc/ld.so.confを編集します。
# vi /etc/ld.so.conf

以下を追加してください。
/usr/local/libldconfig

動的リンカによる実行時の結合関係を設定します。
# /sbin/ldconfig

録画のテストをします。(/tmpにsample.aviが作成されるはずですので、windowsマシンにコピーして映像・音声とも問題ないかを確認にしてください。なお、2行に渡っていますがLinux上で実行する場合は1行で実行してください。)
# /usr/bin/v4lctl setchannel 8
# /usr/local/bin/ffmpeg -f avi -vcodec mpeg4 -acodec mp3 -y -b 1000 -ab 128 -r 30 -s 352x240 -ar 44100 -ac /tmp/sample.avi -t 60

(last update 2006/04/20 監修 段.店裏)

6.ffserver設定

この章では、ffserverの設定ファイルを作成します。
(作業の対象は、LinuxPC3になります。)


# vi /etc/ffserver.conf (中身は以下のとおり)

次にrc.localを編集します。(PC起動時にffserverも起動するようにして標準で8CHを設定するようにします。)
# vi /etc/rc.local

以下を追加してください。
/usr/local/bin/ffserver &
/home/st202/setch.pl 8

(last update 2006/04/20 監修 段.店裏)

7.TV画面CGI(インターフェイス)構築

この章では、TV画面CGI(インターフェイス)構築していきます。

最初にTV画面CGIから呼び出されるチャンネル変更プログラムsetch.plを作成します。
設置する場所は、LinuxPC3の/home/kapler/にしておきます。

$ vi setch.pl

setch.plの中身は以下の通りです。

#!/usr/bin/perl
$str = "/usr/bin/v4lctl setchannel ".$ARGV[0];
system($str);
exit(0);

実行権限を与えます。
$ chmod 755 setch.pl

TV画面CGIを作成します。設置する場所は、LinuxPC1上のWebとして公開可能な場所にしておきます。
(例えば、/home/kapler/public_html/cgi-bin など)

$ vi kapler.cgi (中身は以下のとおり)

続いてexsample.asxを作成します。場所は、LinuxPC1上の/home/kapler/においています。
内容は以下の通りです。

<ASX version = "3.0">
<Entry>
<Ref href="http://192.168.1.11:8090/tv.asf"/>
</Entry>
</ASX>

最後に、LAN内のパソコンからIE等でhttp://192.168.10/cgi-bin/kapler.cgiに
アクセスしてみて下さい。画面が表示されたら下記の項目を確かめてみましょう。

・LinuxPC3の電源は入りましたか?
・TVは映っていて音もでていますか?
・チャンネルを変更して画面は切り替わりましたか?
・WindowsMediaPlayerでもTVは再生されましたか?
・TVサーバーのステータスは表示されましたか?

参考
正常に動作した場合以下の画像のような画面が表示されるはずです。

(last update 2006/04/20 監修 段.店裏)

8.「きゃぷら~」をもっと便利に使う・・・!?

この章では、基本が出来た方のための応用技をご紹介します。

・電源はON出来るけど、OFFはどうすんだ?(埼玉県のチームマイナス6℃さんからのリクエスト)

確かにTVを利用した後、誰も使ってないのに電源が入っているのはもったいないので、
利用者が存在するかどうかを10分間隔でチェックして存在しない場合は、自動的にシャットダウンするようにしてみました。

まず、crontabを編集します。
# crontab -e

以下を追加してください。
0,10,20,30,40,50 * * * * /root/shutdown.pl

次に監視プログラムを作成します。

# vi shutdown.pl (中身は以下のとおり)

設置場所は一般ユーザーがアクセス出来ない場所がいいと思います。この例では/root/においています。

実行権限を与えます。
# chmod 700 shutdown.pl

・手料理だけじゃなくて外食もしたいな~。(東京都のルーターさんからのリクエスト)

●ー●ーに細工をしましょう。Google等で検索すればわかると思います。

・なんだよー。俺はLinuxしか持ってないんだけど、どーすんだよ!?(南極のペンギンさんからのリクエスト)

うーん。確かにそうですよね。( ; ゚Д゚)

(last update 2006/04/20 監修 段.店裏)

9..「きゃぷら~」の抱える問題点について

この章では、きゃぷら~の抱えている問題点について紹介します。

1.音声多重放送の場合に副音声が出力されてしまう。(映画・ニュース番組だと英会話等の外国語の勉強にはいいかも~♪)

この問題については、現在も引き続き調査中です。情報提供大歓迎です。

2.ケーブルTVへの対応(たくさんチャンネルがあるのにモッタイナイですもんね)

「きゃぷら~」の構築してるときは気が付かなかったのですが、ケーブルな環境の方のために簡単に資料を作成しました。
ケーブルな方は以下を参考にしてみてください。

2.1ケーブルな人の場合の例1

.xawtvを編集してケーブルTVの設定にします。
$ vi .xawtv
#freqtab = japan-bcast
freqtab = japan-cable
japan-bcastをコメントにしてjapan-cableを追加します。
これで見られるはず・・・

次にkapler.cgiをチャンネル設定にあわせて適当に編集してください。

2.2ケーブルな人の場合の例2(例1だと1~12までが見られない場合)

xawtvをソースからインストールします。

# tar zxvf xawtv-3.95.tar.gz
# cd xawtv-3.95
# cd frequencies

この中で、ntsc-bcast-jp.listにある1~12までの設定をコピーして
ntsc-cable-jp.listに書き加えます。
(ntsc-cable-jp.listには、13~以降の設定しか無いようです。)

その後以下のコマンドを打ち込んでください。

# apt-get install libjpeg-devel
(libjpeg-develが導入済みであればスキップしてください。)

# ./configure
# make
# make install
(ここでエラーが発生かもしれません。しかしTV自体は無事に動くようです・・・)

.xawtvを編集します。
$ vi .xawtv

japan-bcastをコメントにしてjapan-cableを追加します。

#freqtab = japan-bcast
freqtab = japan-cable

setch.plを編集します。
$ vi setch.pl

setch.pl中のsetchannelの行を以下の様に編集してください。
(v4lctlがどこにインストールされているかで変わります。下記は、./configure で何も指定しない場合の例になります。)
$str = "/usr/local/bin/v4lctl setchannel ".$ARGV[0];

次にkapler.cgiをチャンネル設定にあわせて適当に編集してください。

3.画像の鮮明化(サッカー、野球、相撲、F1、競馬等のスポーツ番組も見たいですよね)

これに関しては色々やってみましたので後ほど・・・

他にも問題?がありましたらご連絡お待ちしております。

(last update 2006/04/20 監修 段.店裏)

10.「きゃぷら~えぼりゅーしょん」


「きゃぷら~えぼりゅーしょん」は「きゃぷら~」の抱えている問題点のうちのひとつ"画像の鮮明化"に
スポットを当ててアップグレードしようという目的でスタートしました。
「きゃぷら~」を構築してから、友人のみ~あでぃっち氏より1通のメールを頂きました。
内容は、「最近のFlash(フラッシュ)はすごいらしいぞ~」というものでした。

Flashといえばごく普通にWeb画面に出てくるものとしか思っていませんでしたが、いろいろ調べていくうちに
Flash Video(拡張子がflvのもの)なるものが存在するということがわかりました。
(今までは、Flashといえば拡張子がswfのものだと思っていました。)
Flash Videoがどんなものであるかは、http://www.youtube.com/ を見ると様々なVideoが公開されていますので
一度見て見るといいと思います。

Flashの利点?はたくさんあると思うのですが、私が気になったのは3点です。

・絵が結構滑らかなのでは???
・SWFの内部でスクリプトを記述することが可能
・メディアプレーヤをサポートしていないOSでも絵を見ることが可能(LinuxやMACでも♪)
(もちろん、Flashプレーヤーはダウンロードしておかないといけませんが、ない場合は自動的にダウンロードが開始されます。)

で、なんとか「きゃぷら~」に応用出来ないかなと思い始めました。

############################
#ストリーミングの実験の前に#
############################

ストリーミングを始める前の実験として、flvのファイルをサーバーに設置して、他のPCから再生出来るかどうかテストしてみる
ことにしました。

1.flvとswfファイルの取得

とりあえずflvファイルを自分のパソコンにダウンロードしてみようと思い、いろいろ検索して試した結果ダウンロードには
成功したのですが、ブラウザに突っ込んでも再生出来ませんでした。
なぜなんだ~と悩みつつ、更に色々調べたところflvファイル単体では再生は出来ないことがわかりました。
具体的にいうと、swfというファイルがあってこいつがコントローラ的な役割を果たしていてflvを呼び出しているということでした。

次にflvファイルを呼び出していそうなswfファイルを探してみることにしました。
かなり苦労しましたがいろいろ検索していたところ以下のページを見つけました。

FLV Player v3.2
http://www.videospark.com/index.php?ssp=24

2.サーバー環境でのテスト

先ほどのページでは、PHPなページの2つのサンプルページを使ってflvファイルを再生する
ためサンプルがおいてあります。(もちろんswfファイルもありますよ!)
(違いはナビの部分がJAVASCRIPTで作られているかかPHPで作られているかのようです。ページ自体がPHPで記述されれいるため
どちらにしてもPHPが導入されていないサーバーではNGですのでご注意ください。)

"Download Source Code Here"をクリックしてダウンロードしました。解凍すると2つのフォルダが出来ます。
私は、php_powered_navigation_versionというフォルダの中身を全部サーバーにアップロードしてみることにしました。

その結果が以下の図になります。
(123というものは筆者が個人的にダウンロードしたファイルを設置しているために表示されています。)
図中のビデオの名前をクリックするとめでたくビデオが再生されました♪

3.サーバー環境以外でのテスト

サンプルのページではPHPが動作しない環境では何も出来ないので、htmlのみで再生するためにはどうすればいいのかを
調査してみることにしました。(もちろん、htmlファイルとflvファイルとswfファイルが同じ場所にあることになります。)

いろいろ調査してみて試行錯誤してみたところ以下のようなテストページ(flvtest.html)を作成しました。

長いのでダウンロードしてください。


このflvtest.htmlと同じ場所にflvファイルとswfファイルを設置してみたところ、ブラウザ上でめでたくビデオが再生されました♪

4.ここまで強行軍だったのでちょっと後戻り(swfファイルの中はどうなっているの!?)

ここでふと疑問が残りました。flvファイルはビデオのファイルだからいいけど、swfファイルの中身はどうなってるんでしょう!?
これもいろいろと検索した結果、Macromedia Flash 8というアプリケーションで編集可能ということがわかりました。
(Macromedia Flash 8は、MacromediaのHPよりダウンロードして30日間使用出来ます。)
ですが、Macromedia Flash 8の使い方がまだ全然わかっていないのでswfの内容に関しては引き続き調査していく予定です。

#######################################################
#ffmpegとffserverを用いたflv形式のストリーミングの実験#
#######################################################

実験を踏まえてストリーミングに挑戦してみました。

ffserverの設定ファイルを編集します。
# vi /etc/ffserver.conf

ffserverの設定に以下を追加してください。

<Stream test1.flv>
Feed feed1.ffm
Format flv
#AudioBitRate 32
#AudioChannels 1
#AudioSampleRate 22050
#VideoBitRate 200
#VideoFrameRate 10
VideoBitRate 500
VideoFrameRate 30
VideoSize 320x240
##VideoSize 640x480
#VideoIntraOnly
VideoGopSize 30
NoAudio
VideoCodec flv
#AudioCodec mp3
</Stream>

続いてflvtest.htmlを編集します。

修正前
<param name=Flashvars value="url=http://192.168.1.10/test.flv">

修正後
<!--param name=Flashvars value="url=http://192.168.1.10/test.flv-->

続いて以下の行を追加します。(ポート番号はffserver.confで設定してあるものにして下さい。)
<param name=Flashvars value="url=http://192.168.1.10:8090/test1.flv">

念のため再起動します。
# sync;sync;sync;shutdown -r now

ブラウザで、
http://192.168.1.10/flvtest.html
にアクセスしてみてください。以下の様な映像が表示されていたら成功です!

画像表示前(flvファイル読み込み中)


画像表示後


ここで勘が鋭い方は気付くかもしれませんが、そうなんです。音が出ていません。
実は音を出そうとするとffserverは起動はするのですがすぐにエラーを吐いて死んでしまうのです。
(音を出す場合は、上記で追加したffserver.confに追加した部分を以下の様に編集してください。)

<Stream test1.flv>
Feed feed1.ffm
Format flv
AudioBitRate 32
AudioChannels 1
AudioSampleRate 22050
#VideoBitRate 200
#VideoFrameRate 10
VideoBitRate 500
VideoFrameRate 30
VideoSize 320x240
##VideoSize 640x480
#VideoIntraOnly
VideoGopSize 30
#NoAudio
VideoCodec flv
AudioCodec mp3
</Stream>

念のため実験に使っていたffmpegのバージョンも調べてみましたが、0.4.8でもちろんflvも対応していました。
(お使いのffmpegがどのフォーマットに対応しているかを調べるには、/usr/bin/local/ffmpeg --formatsと入力してください。)

そこで、ffmpegのバージョンをあげてみることにしました。
まず試してみたのは、0.4.9-pre1というものでした。しかし、音が出るどころかより不安定になってしまいました。
次に、CVSバージョンをインストールしてみました。そうすると音は出るのですがしばらくすると映像が
止まってしまうようになってしまいました。かなりおしい感じです。
現状では、画像と音声を別々にすればとりあえず見られるのかもしれません。

中途半端な形になってしまいましたが、実験は終了しました。
残念ながら音は出ませんでしたが、映像自体の品質は大変いいものだと思いました。
ですので、引き続き調査を行い続きをご報告出来ればと考えています。

(last update 2006/04/20 監修 段.店裏)