UNIXでTVを見よう



法林 浩之

(株)インターネット総合研究所
hourin@suplex.gr.jp





(page 1)


何の話をするのか




(page 2)


今日の守備範囲




(page 3)


(個人的な)経緯




(page 4)


必要なもの





(page 5)


PC本体の選定




(page 6)


OSの選定




(page 7)


カード選び




(page 8)


FreeBSDで対応しているチップ






(page 9)


Linuxで対応しているチップ




(page 10)


結局どのカードを使えばいいの?




(page 11)


現在販売されているカードで使えそうなもの




(page 12)


FreeBSD,LinuxでTVチューナーカードを使う





(page 13)


FreeBSDでのカーネル再構築手順





(page 14)


カーネル設定ファイルに追加する項目




(page 15)


カード/チューナーの指定




(page 16)


FreeBSDでのデバイス認識例

% cat /var/run/dmesg.boot
(抜粋)
bktr0: mem 0xe2000000-0xe2000fff irq 10 at device 18.0 on pci0
iicbb0: on bti2c0
iicbus0: on iicbb0 master-only
iicbus1: on iicbb0 master-only
smbus0: on bti2c0
bktr0: Card has no configuration EEPROM. Cannot determine card make.
bktr0: Pinnacle/Miro TV, Philips NTSC tuner.



(page 17)


Linuxでのカーネル再構築手順(Bt8x8編)

  • 一般的な手順と同じでよい
    • カーネルの設定変更
      # cd /usr/src/linux
      # make menuconfig (あるいはmake xconfig)
    • カーネルのコンパイルとインストール
      # make dep clean bzImage modules modules_install
      # cp arch/i386/boot/bzImage System.map /boot/
    • デバイスファイルの作成
      # cd /dev
      # ./MAKEDEV video ← キャプチャー用
      # ./MAKEDEV audio ← サウンド用
    • /etc/modules.confの設定
      # vi /etc/modules.conf
    • 再起動
      # reboot



(page 18)


カーネルの設定変更(Bt8x8編)

  • Multimedia devices → Video 4 Linuxをmに
    • その下のVideo 4 Linux → BT848 Video 4 Linuxをmに
      mm.jpg v4l.jpg



(page 19)


カーネルの設定変更(Bt8x8編)(つづき)

  • Video 4 Linuxを使うために必要な設定
    • Character devices → I2C support
      • I2C support, I2C bit-banging interfacesをmに
        i2c.jpg
  • サウンド関係の設定
    • Sound Card Supportをyに
    • 持っているサウンドカードに対応した設定をする
    • デバイスドライバはOSSを使用
      • ALSAだと後で困るので



(page 20)


/etc/modules.confの設定(Bt8x8編)

  • BT878A-STVPCI2使用時の追加項目
    alias char-major-81 bttv ←デバイス番号
    options bttv card=78 ←キャプチャーカード番号
    options tuner type=2 ←TVチューナー番号
  • カード/チューナーの番号は /usr/src/linux/Documentation/video4linux/bttv/CARDLISTを参照
  • キャプチャーカード番号の例
    card=0 - *** UNKNOWN/GENERIC ***
    card=78 - Jetway TV/Capture JW-TV878-FBK, Kworld KW-TV878RF
    card=81 - GV-BCTV5/PCI (IO/DATA)
    card=99 - AD-TVK503 (アルファデータ)
  • TVチューナー番号の例
    type=2 - Philips NTSC (FI1236,FM1236 and compatibles)
    type=4 - NoTuner
    type=31 - SHARP NTSC_JP (2U5JF5540)
    type=40 - HITACHI V7-J180AT



(page 21)


bttvドライバ使用時のデバイス認識

  • モジュールとして組み込んだときは、デバイス使用時に認識される
% dmesg
(抜粋)
Linux video capture interface: v1.00
bttv: driver version 0.7.104 loaded
bttv: Bt8xx card found (0).
bttv0: using: BT878(Jetway TV/Capture JW-TV) [card=78,insmod option]
i2c-core.o: adapter bt848 #0 registered as adapter 0.
bttv0: using tuner=5
i2c-core.o: driver i2c TV tuner driver registered.
tuner: probing bt848 #0 i2c adapter [id=0x10005]
tuner: chip found @ 0xc0
tuner(bttv): type forced to 2 (Philips NTSC (FI1236,FM1236 and ..)) [insmod]
bttv0: registered device video0
bttv0: registered device vbi0
bttv0: registered device radio0



(page 22)


Linuxでのカーネル再構築手順(SAA713x編)

  • 普通の再構築に比べて手間が増える(※の部分)
    • ※カーネル2.4のソースコードにパッチを当てる
    • カーネルの設定変更
    • カーネルのコンパイルとインストール
    • デバイスファイルの作成
    • (慎重にやるならここで再起動)
    • ※saa7134ドライバのインストール
    • /etc/modules.confの設定
    • 再起動



(page 23)


カーネル2.4のソースコードにパッチを当てる





(page 24)


saa7134ドライバのインストール




(page 25)


/etc/modules.confの設定(SAA713x編)

  • SAA7130-STVLP使用時の追加項目
    alias char-major-81 saa7134 ←デバイス番号
    options saa7134 card=10 ←キャプチャーカード番号
    options tuner type=2 ←TVチューナー番号
  • キャプチャーカードの番号はsaa7134-0.2.10/doc/CARDLIST.saa7134を参照
    0 -> UNKNOWN/GENERIC
    5 -> SKNet Monster TV
    10 -> Kworld/KuroutoShikou SAA7130-TVPCI
    13 -> ELSA EX-VISION 300TV
    14 -> ELSA EX-VISION 500TV
    16 -> AOPEN VA1000 POWER
  • TVチューナーの番号はsaa7134-0.2.10/doc/CARDLIST.tunerを参照
    • 内容はBt8x8編で解説したものと同じ



(page 26)


saa7134ドライバ使用時のデバイス認識

  • モジュールとして組み込んだときは、デバイス使用時に認識される
% dmesg
(抜粋)
i2c-core.o: i2c core module
Linux video capture interface: v1.00
saa7130/34: v4l2 driver version 0.2.9 loaded
saa7130[0]: subsystem: 1131:0000, board: Kworld/KuroutoShikou SAA7130-TVPCI [card=10,insmod option]
i2c-core.o: adapter saa7130[0] registered as adapter 0.
i2c-core.o: driver i2c TV tuner driver registered.
tuner: chip found @ 0xc0
tuner(bttv): type forced to 2 (Philips NTSC (FI1236,FM1236 and ..)) [insmod]
tuner: type already set (2)
saa7130[0]: registered device video0 [v4l2]
saa7130[0]: registered device vbi0



(page 27)


TV視聴アプリケーション

  • あれこれ紹介せずに、代表的なものを紹介
    • FreeBSD: fxtv
    • Linux: xawtv



(page 28)


fxtv

  • http://people.FreeBSD.org/~rhh/fxtv/
  • Bt8x8用のTV視聴アプリケーション
  • 最新版は1.03だが、現在は開発が止まっている模様
  • FreeBSD,NetBSD,OpenBSDともバイナリパッケージあり
    • というわけでインストール方法は省略(^_^;)



(page 29)


fxtvの設定方法

  • fxtvには設定ファイル(.fxtvなど)がないらしい
    • 膨大かつ長いコマンドオプションで設定
    • Xのリソースファイルで設定
      • オリジナルは/usr/X11R6/lib/X11/app-defaults/Fxtv
  • 今回はXのリソースファイルで設定
    Fxtv*inputFormat: ntscj
    Fxtv*defaultInput: tuner
    Fxtv*defaultAudioInput: tuner
    Fxtv*tunerMode: cable (アンテナの場合はantenna)
    Fxtv*cableFreqSet: jpncable
    Fxtv*cableStationList: 1-12 (CATVのチャンネル範囲に合わせる)
    Fxtv*antennaFreqSet: jpnbcst
    Fxtv*antennaStationList: NHK(2) MBS(4) ABC(6) KTV(8) YTV(10)



(page 30)


fxtvの使い方

  • チャンネルの切り替え: ↓↑ボタン
  • 入力系統の切り替え: Input → Tuner/S-Video
  • 画面の拡大
    • 起動時はオプションで指定
      % fxtv -geometry 640x480
    • 起動後は×ボタンで拡大/縮小
  • フルスクリーンで表示する方法は不明(ないかも)
  • 大画面で見たいときは
    • あらかじめXFree86を低解像度で表示できるように設定
    • xvidtune -nextで解像度を切り替える
  • 画像の取り込み、録音、録画もできる

fxtv.jpg


(page 31)


xawtv


  • http://bytesex.org/xawtv/
  • saa7134ドライバと同じ作者によるもの
  • LinuxでもFreeBSDでも動く
  • 最新版は3.91
  • rpm,dpkg,FreeBSDのportsにもあり
    • VinePlusで提供されているrpmはバージョンが古い
  • ソースコードからのインストール手順
    % configure
    % make
    # make install

xawtv.png



(page 32)


xawtvの設定

  • .xawtvにて設定

    [global] ← チャンネルに関係ない設定
    freqtab = japan-cable ← アンテナ受信ならjapan-bcast

    [defaults] ← 各チャンネルに対するデフォルト設定
    norm = ntsc ← NTSC
    input = television ← TV入力

    [1ch] ← チャンネル名
    channel = 1 ← チャンネル番号
    key = 1 ← 1キーを押すと1chに
    ....
    [12ch] ← チャンネル名
    channel = 12 ← チャンネル番号
    key = plus ← +キーを押すと12chに
    [skapa] ← スカパー
    input = svideo ← S-Video
    key = 0 ← 0キーを押すとスカパーに




(page 33)


.xawtv設定上の注意

  • 一部の設定項目において、大文字が有効なときと小文字が有効なときがある
    • 小文字: ntsc,television,svideo,compisite1
    • 大文字: NTSC,Television,S-Video,Composite1
    • 最近のバージョンでは小文字表記らしいのだが…
  • どちらか片方しか有効にならない(もう片方だとエラーになる)
  • xawtv起動時に怒られたら修正する



(page 34)


xawtvの使い方


  • チャンネル/入力系統の切り替え: マウス左クリック → 選択
  • 画面サイズは起動時のオプションで
    % xawtv -geometry 640x480
  • フルスクリーン表示: 画面内でF
    • fxtvの所で紹介した方法でXを低解像度にしておくと大画面になる
  • 画像の取り込み、録音、録画もできる
    • XFree86起動時にXvideoを有効にしていると取り込めない → xawtv -noxv で起動すれば取り込める


xawtv2.jpg


(page 35)


xawtv使用上の注意

  • japan-cableに設定すると13ch以降しか映らない
    • ソースコードに1-12chの周波数データが載っていないため
  • 対策: xawtv-3.91/frequencies/ntsc-cable-jp.listを修正してコンパイル
  • 修正個所: ファイルの先頭に以下を追加
     [1]
     freq = 91250
     [2]
     freq = 97250
     [3]
     freq = 103250
     [4]
     freq = 171250
     [5]
     freq = 177250             
     [6]
     freq = 183250
     [7]
     freq = 189250
     [8]
     freq = 193250
     [9]
     freq = 199250
     [10]
     freq = 205250
     [11]
     freq = 211250
     [12]
     freq = 217250
    
  • 参考: 地上波とCATVの周波数一覧



(page 36)


v4lctl (V4LCTL)

  • Video 4 Linuxデバイス操作コマンド
  • xawtvの付属品
  • チャンネルの操作
    % v4lctl setchannel 1ch
  • 入力系統の操作
    % v4lctl setinput svideo
  • チャンネル名や入力系統は.xawtvを参照して動作する
  • ところが、v4lctlとxawtvで.xawtvの記法が異なることがある
    • ntsc/NTSC,svideo/S-Videoなど
    • 対策: 設定ファイルを2種類用意し、切り替えて使用
  • リモートで操作するときに役立つ



(page 37)


リモートでTVを見る方法

  • 基本アイデア
    • TVチューナーカードから得た映像/音声を ストリーミングで流し、端末で受信する
    • 今回はRealVideoを使う方法を紹介
  • システム構成
    remote1.png
  • この方法の特徴
    • さまざまな接続形態に対応できる
      • 会社、旅先、移動中など
    • 映像だけでなく音声も届き、同期も取れる
    • 画質は期待できない(特に低速回線で見るとき)




(page 38)


リモートでTVを見るために必要なもの

  • Helix Producer: エンコーダ
    • RealVideo9コーデックを使用
    • 必ずTVチューナーと同一マシンで動かす
  • Helix Universal Server: サーバ
    • 今回はTVチューナーと同一マシンで動かすが、別マシンでも可
  • RealPlayer: プレーヤー
    • TVチューナーと別マシンで動かす
    • 同一マシンにもインストールしておくと動作確認時に役立つ
  • 常時接続回線とグローバルIPアドレス
    • 外出先からTVサーバに接続するのに必要
  • TVサーバはLinuxで構築
    • Helix ProducerにFreeBSD版がないため
  • 端末はRealPlayerさえ動けばどんなOSでもよい
    • 今回はFreeBSDを使用



(page 39)


RealPlayerのインストール

  • Windows, Macの人: RealOnePlayerを使用
    • RealVideo9コーデックに対応済み
  • Linux, BSDの人: RealPlayer8(Linux版)を使用
    • BSDの人はLinuxエミュレータ使用
    • RealVideo9コーデックに未対応 → 後からライブラリを追加して対応



(page 40)


RealPlayer8のRealVideo9コーデック対応方法




(page 41)


Helix Producerのインストール

  • Helix Producer Basic(無償版)を入手
  • 入手したファイルを実行してインストール
    • expressインストールでよい
  • 注意: サウンドドライバはOSSを使うこと
    • Helix ProducerはALSAに対応していないらしい



(page 42)


Helix Producerが使うデバイスの検出

% producer -pd

VIDEO
Device 00: Kworld/KuroutoShikou SAA7130-TV /dev/video0
Port 00: S-Video ← スカパー
Port 01: Composite1
Port 02: Television ← TVチューナー

AUDIO
Device 00: Sound Blaster /dev/dsp
Port 00: synth
Port 01: line ← スカパー
Port 02: mic ← TVチューナー
Port 03: cd



(page 43)


Helix Producerの動作確認

  • v4lctlでTVを起動
    % v4lctl setstation 1ch
  • Helix Producerでファイルに出力(つまり録画)
    % producer -ac 00 -ap 02 -vc 00 -vp 02 -cs 240x180 -ad '150k' -o test.rm
    • -ac: オーディオデバイス番号
    • -ap: オーディオポート番号
    • -vc: ビデオデバイス番号
    • -vp: ビデオポート番号
    • -cs: 画面サイズ
    • -ad: 帯域
    • -o: 出力ファイル名
  • 適当な所でCtrl-Cを打って録画終了
  • RealPlayerでtest.rmを再生できればOK



(page 44)


Helix Universal Serverのインストール

  • Helix Universal Server Basic(無償版)を入手
    http://licensekey.realnetworks.com/rnforms/products/servers/eval/index.html?ulf=b
  • 入手したファイルを実行してインストール
  • インストール時にいろいろと指定する
    • ライセンスキー: 入手するとXML形式のファイルがメールで届く
    • インストール先のディレクトリ
    • ユーザ名とパスワード: エンコーダからの ストリーム受付や管理画面での認証に使用
    • 各種ポート番号: PNM(デフォルト: 7070)、RTSP(デフォルト: 554)、 HTTP(デフォルト: 80)、MMS(デフォルト: 1755)、 管理画面(デフォルト: 乱数)
  • 起動
    # cd (インストール先)
    # Bin/rmserver rmserver.cfg
  • RealPlayerで動作確認
    • rtsp://serverhost.domain.jp/real9video.rm が再生できればOK



(page 45)


Helix ProducerからHelix Serverへの送出

  • 同一マシンでProducerとServerを動かすとする
    % producer -ac 00 -ap 02 -vc 00 -vp 02 -cs 240x180 -ad '28k,56k,256k' -sp username:password@localhost:80/stream.rm
    • -ad: 帯域
      • 複数指定すると、回線状況に応じて帯域が動的に変化(SureStream)
      • 指定できる数字は、$INSTALLDIR/audiences/ を参照(最大3つ)
    • -sp: Helix Serverとの接続方法、ストリーム名など
      • 書式: username:password@serverhost.domain.jp:port/stream.rm
      • username,password: Helix Serverインストール時に指定したもの
      • serverhost: Helix Serverのホスト名かIPアドレス
      • port: Helix Serverインストール時に指定したHTTPポート番号
      • stream.rm: ストリーム名(自由に指定)
    • RealPlayerで動作確認
      • rtsp://serverhost.domain.jp/broadcast/stream.rm が再生できればOK


(page 46)


外出先からの接続

  • 必要なもの
    • 常時接続回線
      • ストリームは上り回線を流れることに注意
    • グローバルIPアドレス
      • 最低1個、固定でも動的でもよい
  • システム構成
    • TVサーバがグローバルIPアドレスを持っているとき
      • 端末からは、そのIPアドレスのHelix Serverにアクセスする
    • TVサーバがプライベートIPアドレスを持っているとき
      • 例えば、自宅にLANがあるとき
      • たいていルータが入っているので、そこで細工する



(page 47)


自宅にLANがあるときの構成

  • システム構成
    remote2.png
  • ルータでの設定
    • IPマスカレードの設定により特定ポートへのアクセスをTVサーバに向ける
  • IPマスカレードを設定するポート
    • RTSPのポート(デフォルト: 554/tcp)
    • HTTPのポート(デフォルト: 80/tcp)
    • 管理画面のポート(デフォルト: 乱数/tcp)
    • モニター画面のポート(デフォルト: 9090/tcp)
    • SSHのポート(デフォルト: 22/tcp)
      • TVマシンにリモートログインして操作



(page 48)


自宅LAN内TVの視聴方法

  • sshでルータのアドレスを指定(アドレス変換されてTVサーバへ)
    % ssh 200.1.1.1
  • TVを起動
    % v4lctl setstation 1ch
  • Helix Producerを起動しストリーム送出開始
    % producer -ac 00 -ap 02 -vc 00 -vp 02 -cs 240x180 -ad '28k,56k,256k' -sp username:password@localhost:80/stream.rm
  • RealPlayerで動作確認
    • rtsp://200.1.1.1/broadcast/stream.rm
  • 実際にはTV視聴用シェルスクリプトを作成し、TVサーバにて実行
    % ./stream.sh 1ch 28k,56k,150k
    • cronやatコマンドで指定時刻に起動することも可能


(page 49)


TV視聴用シェルスクリプト


 #!/bin/sh
 #$1: チャンネル名、$2: 帯域
 channel=$1
 bitrate=$2
 #すでにxawtvが動いていたらkillする
 killall xawtv
 #v4lctlでTVを起動
 cd $HOME
 cp .xawtv-big .xawtv
 /usr/local/bin/v4lctl setstation $channel

 #入力系統に応じた設定
 case $channel in
 skapa) #スカパー
 	# audio from line
 	audioport="01"
 	/usr/bin/aumix -l 60
 	/usr/bin/aumix -m 0
 	# video from S-Video
 	videoport="00"
 	;;

 *)     #地上波
 	# audio from mic
 	audioport="02"
 	/usr/bin/aumix -l 0
 	/usr/bin/aumix -m 50
 	# video from Television
 	videoport="02"
 	;;
 esac
 
 #producerを起動
 /usr/local/bin/producer -ac 00 -ap $audioport -vc 00 -vp $videoport -cs 240x180 -ad $bitrate -sp username:password@localhost:80/stream.rm



(page 50)


回線状況に応じた設定

  • サーバ〜端末の回線状況を推測し、エンコーダの帯域を設定する
  • 低速回線で接続しているとき(PHSなど): 28k固定で設定
  • 高速回線で接続しているとき(ホテルのLANなど): 150kぐらいの固定で設定
    • 回線状況により調整
  • 回線状況が大きく変化するとき(会社のLANなど): 幅広く3種類選んで設定
    • 28k,64k,150kとか


(page 51)


映像素材に応じた設定

  • 動きの多い素材(スポーツ中継など): フレーム数を重視する
    • 画面サイズを小さくする
    • producerコマンドで-vm smoothを追加する
    • ただし低速回線のときは、フレーム数を稼ぐのはあきらめる
      • 画質が粗くなり鑑賞に耐えなくなる
  • 動きの少ない素材(ニュース、ドラマなど): 各コマの画質を重視する
    • producerコマンドで-vm sharpを追加する



(page 52)


まとめ


UNIXマシンでTVを見る方法を紹介

  • UNIXマシンでTVチューナーカードを動かす
    • FreeBSD
      • Bt8x8系チップとbktrドライバ
    • Linux
      • Bt8x8系チップとbttvドライバ
      • SAA713x系チップとsaa7134ドライバ
  • TV視聴アプリケーションを動かす
    • FreeBSD: fxtv
    • Linux: xawtv
  • リモートでTVを見る
    • RealVideoによるライブ配信(見るのは自分だけ)



(page 53)


参考文献

  • BSD magazine 第9号(2001年): bktrドライバ、fxtvの紹介
  • UNIX magazine 2001年8月号「UNIX便利帖」: fxtvの紹介
  • Software Design 2003年3月号「Linux, ビデオデッキ化計画」
  • 「Linuxカーネル設定ガイド」翔泳社
  • 「Helix Universal Server Advanced Book」BNN新社
  • Linuxでのハードディスクレコーダ構築の記事
    • 日経Linux 2003年12月号
    • Software Design 2004年2,3月号





(page 54)


質問受け付けます


  • 難しいことはたぶんわかりません(^_^;)
    • 特にデバイスドライバの実装の詳細とか

  • 懇親会もありますのでぜひご参加ください


(page 55)