FMラジオ&テレビ録画サーバの構築.ストリーミングで鑑賞

暫定版
['04/01/04]追記
['03/11/23]追記
['03/03/27]初稿
■はじめに
■環境について
 ホンページでは,Vine Linux 2.6r1をベースとした環境に関して解説します. Vine2.5以前の場合は apt-get を使用してアップデートを行い,2.6r1ベースの最新版と同等環境にする ようにしてください.また,その他のLinuxディストリビューションを利用していたり,Asus Terminator TU 以外のマシンを使用している場合,本ページの内容がそのまま利用 できない場合があります.その場合は,参考程度に読むようにしてください.

■用意したボード
 詳しくは後述しますが,Linux で TV キャプチャを行う場合, 基本的にソフトウエアエンコードを行う 必要のあるキャプチャカードを利用することになります.最近は MPEG2 ハードウエア 圧縮を行うカードが廉価かつ主流になって来ていますが,これらはまだ Linux では 安定して動作しません.また,MotionJPEG圧縮を行うカード で動作するものもありますが,国内での入手性はあまり良くないでしょう.

[03/11/23追記] CX23415/CX23416を使用した MPEG1/2 ハードウエアエンコーダ搭載カードも安定して動き始めました.詳しくは こちらのページを参照のこと

 そのため,今回は Linux 上で動作実績が豊富にある,BT878 互換のチップを搭載 した TV チューナー付きのキャプチャカードを用意しました.用意したのは, AOpen VA1000 Lite および, I/O data GV-BCTV5/PCI の2種類です.

■TVを観る下準備
■オーディオ関係のセットアップ
 まずは,TVキャプチャカードの設定を行う前に,Vine Linuxで音声の録音および 再生が可能になるようにセットアップします.基本的に Terminator TU であれば, Vine2.5β2以降を使用することにより,自動でオーディオチップを認識するはずです. 認識しない場合は,root権限でsndconfigコマンドを実行してください. このコマンドを実行することにより,サウンドカードに関して適切な設定がされる はずです.なお, 素の(アップデートを行っていない)Vine2.5 を Kernel2.4 で動かした場合,sndconfig が実行できません.アップデータとしてsndconfig-0.68-2vl1.i386.rpm が 提供されていますので,ftp サイトからダウンロードし,アップデートしてから 実行するようにしてください.

 ちなみにVine2.6r1を Terminator TU で動かした場合,trident, ac97_codec, soundcore が読み込まれます.ちなみに soundconfig 実行後に設定される, /etc/modules.conf の当該部分は,以下のようになります.

alias sound-slot-0 trident
post-install sound-slot-0 /bin/aumix-minimal -f /etc/.aumixrc -L >/dev/null 2>&1 || :
pre-remove sound-slot-0 /bin/aumix-minimal -f /etc/.aumixrc -S >/dev/null 2>&1 || :

※"post-install", "pre-remove" の行は,それぞれモジュールがロードされる 前後に,オーディオミキサー の設定をファイルから読み込む/書き出す設定です.

 次に,オーディオミキサーを設定します.オーディオミキサーとは,各デバイスの ボリュームや入力レベル等を設定するためのものです.スピーカーから出力される 再生音声は,ミキサーで設定されたレベルのものが合成されて再生されると共に, 録音時には録音デバイスとして選択されたデバイスからの音声が,IGAIN で設定 されたレベルで録音されます.

 こでは X-window 上でグラフィカルに設定できる aumix-X11 の 画面ダンプを示しますが,コマンドライン上で aumix を使用して設定する ことも可能です.これらコマンドは,現在のミキサー設定をファイルに書き 出すことが可能であり,aumix-minimal コマンドで,予め用意したファイルを 読み込むことも可能です.


aumix-X11 の実行画面

 画面上では入力デバイスとしてLine-IN を選択しています(画面上で赤いマーカー) が,キャプチャカードからの出力を CD-IN に接続した場合,CD を REC に選択します. なお,IGAIN が 100になっていますが,音が割れたりコモったりしない適正な レベルに調整しましょう.なお私は BCTV5/PCI の音声出力を CD-IN に内部接続 し,以下のような設定で使用しています.これを "/etc/.aumixrc" として保存すると, 再起動時には自動的にこの設定が読み込まれます.

※VA100 liteの場合,ケース内で配線することが出来ないため,ブラケットから Line-In 端子に配線して接続する形になります.この場合は,録音デバイスは Line-In にする必要があります.

vol:67:67:P
pcm:67:67:P
speaker:67:67:P
line:0:0:P
mic:0:0:P
cd:59:59:R
pcm2:67:67:P
igain:25:25:P
line1:72:72:P
phin:62:62:P
phout:67:67:P
video:55:55:P

 若干補足説明を加えますと,1カラム目が入力デバイス,そして各チャンネル (L,R.ステレオ)のレベル,そして再生(P)のみにするか,録音(R)にも使用するか の種別です.なお,大抵の環境では,録音デバイスを複数にすることは出来ない ので,"R"は1つのデバイスのみに指定するようにしましょう(複数指定した 場合,後に設定されたものが優先されます).

■キャプチャカードの選択
 LinuxでTVを観る際に,最も肝の部分は,使用するTVキャプチャカードの選択です. 2003年3月現在,Linuxで安定して利用できているキャプチャカードは, ソフトエンコードのカードのみです. その他のカードは入手困難であったり,動作が不安定でしょう.

 キャプチャカードが Linux で動作するためには,いくつかの条件があります.まずは そのビデオチップですが,Philips SAA7130/SAA7134Matrox MetroII, Conexant (旧:Brooktree)BT848/BT878 等の Linux で利用可能なドライバが 存在する必要が あります.また,ドライバーが存在する場合でも,カード独自の特殊なドライバでは なく,Video4Linux に対応したドライバを利用可能な方が良いでしょう.

 では,これら対応したビデオチップを搭載していれば動くかというと,そうでは ありません.搭載されているTVチューナーの種類,カード上のオーディオチップの 種類,その他設定等の問題により,利用できない場合があるほか,利用可能に するまでに一筋縄で行かないカードも存在します.新規に購入するのであれば, Linux での動作実績に関して下調べをした方が良いでしょう.

 私は最も実績があり,かつ,廉価な BT878 チップを利用したカードを利用する ことにしました.なお,手元の Linx BOX にインストールされている bttv ドライバで利用可能なカードは, /usr/src/linux/Documentation/video4linux/bttv/CARDLISTの内容を見る ことにより,チェックすることができます.この中に書かれているカードであれば, 容易に 利用することが可能でしょう.なお,リストされていなければ使えないというわけ ではありません.

■BT878Aチップ搭載のカードを選ぶ
 最近はBrooktreeブランドの BT848/BT878 を使用したカードは, 中古品以外お目にかかることは無く なり,安価なキャプチャカードと言えば CONEXANT Fusion BT878Aチップ搭載のも のになりました.このチップ,一応は BT848 の上位互換のようですが,カード と bttv/Video4Linux ドライバの組み合わせにより,動作が不安定だという話も 聞きます(Vine2.5のときには私も経験しましたが,Vine2.6r1では安定しています).

 ここ1年ほど, MPEG2 ハードウエアエンコーダ搭載のカードが急速に廉価に なるにつれ,次第に BT チップ搭載のカードを店頭で見かけなくなりつつ なって来たような気がします.確実にLinuxでの動作検証が取れているカードが入手 しにくくなる現状は辛いものがありますが,まぁ時代の流れでしょうね…

 日本国内で,現行商品としてわりと入手しやすいものを独断と偏見(自分で使用し てみたり,身近な人が使っているのを確認した)で選ぶとすると,本ページで 紹介する I/O Data GV-BCTV5/PCIAOpen VA1000 lite.または,玄人志向 BT878A-STVPCI2(KworldカードのOEM)辺りがお奨めです.値段的には,大抵5000円〜1万円くらいで売られています.

■I/O Data GV-BCTV5/PCI編
■I/O Data GV-BCTV5/PCI
 I/O Data の現行商品です.並行してハードウエア MPEG エンコーダ内蔵のカード (GV-MPG3TV/PCI) が売られており,価格差がかなり微妙なため,注目されることは あまり無いような感じがしますが,ソフトエンコード TVキャプチャカードの中では, 画質がとても良いカードであると思います(とは言え,MTV2000 には逆立ちしても かないません).機能的にも,TVチューナ (CATVも対応) の他に FMチューナも付き,音声はステレオ,音声多重(EIAJ方式)対応であり, Linux で使う場合に求めたい機能は一通り搭載しています.国内メーカー製のため, 入手性もまずまずです.

 ただ難点はその価格で, BestGateの検索ページで 調べますと,13,000円〜15,000円程('03/02現在)であり,玄人志向のカードが 5,000円以下で 購入できる(ただし FMチューナ機能は無し)ことを考えますと,かなり割高に感じ ます.私はと言いますと,'02の春先に,近所の電機店の閉店セールで1万円を かなり割り込む金額で購入しました.

I/O Data GV-BCTV5/PCI 外箱.カードの他,ソフト,オーディオケーブル, リモコンなどが付いてきます
カードはこのように奥行きの短いサイズになっています
使用チップは FUSION 878A
チューナーは PHILIPS製
ブラケットには,FMラジオ用およびTV用のアンテナ端子(F型コネクタ), 映像入力用のS端子とコンポジット端子,サウンドカードに外部から音声を 入力するためのオーディオ出力端子,リモコン端子等並んでいます
PCI スロットに接続した状態.

M/B 上の黒いコネクタがCD-IN,白いコネクタがAUX.この写真では, GV-BCTV5/PCI の出力を CD-IN へ.CD からのオーディオケーブルは AUX に 接続しています.BCTV5のマニュアルにある通り,カードに CD からの ケーブルを接続し,カードからの出力を M/B の CD-IN へ接続するようにしても 良いでしょう.

■GV-BCTV5/PCI 用の bttvドライバの設定
 TV キャプチャカードは,基本的に挿しただけで自動的に認識し動作する…と, いうわけには行きません./etc/modules.conf に使用するドライバに関する設定 を記述する必要があります.Vine 2.6であれば,以下のように記述することにより, 起動時に自動的に必要なモジュールが読み込まれ,利用できるようになります.

 なお,以下の記述は Vine 2.6 の場合です.インストールされている bttv ドライバが古い場合,card=81 という設定で GV-BCTV5/PCI が利用できません. この場合の設定例は後述します.

※各パラメータの細かな解説は省略します.また,tuner type として 2 (Philips NTSC : FI1236,compatibles)を設定している方もおられるよう ですが,17 (Philips NTSC_M : MK2) が detect されたので,こちらを使用 しています.

# for BCTV5/PCI(Vine 2.6)#########################################
alias char-major-89 i2c-dev
options i2c-core i2c_debug=0
options i2c-algo-bit bit_test=1
alias char-major-81 videodev
alias char-major-81-0 bttv
alias char-major-81-1 tvaudio
options bttv card=81 radio=1
options tuner type=17
pre-install bttv modprobe -k msp3400; modprobe -k tuner
post-remove bttv modprobe -r msp3400; modprobe -r tuner

 このように設定した後に再起動し,きちんとカードが認識されている かをメッセージで確認してください.例えば dmesg コマンドで当該部分 を確認すると,(/var/log/messagesにも記録されます)


Linux video capture interface: v1.00
tuner: ignoring SMBus SIS630 adapter at e480 i2c adapter [id=0x40008]
tuner: ignoring ISA main adapter i2c adapter [id=0x50000]
bttv: driver version 0.7.100 loaded
bttv: using 4 buffers with 2080k (8320k total) for capture
bttv: Host bridge is Silicon Integrated Systems [SiS] 630 Host
bttv: Bt8xx card found (0).
bttv0: Bt878 (rev 17) at 00:0d.0, irq: 11, latency: 32, mmio: 0xef800000
bttv0: detected: I-O Data Co. GV-BCTV5/PCI [card=81], PCI subsystem ID is 10fc:4070
bttv0: using: BT878(GV-BCTV5/PCI) [card=81,insmod option]
i2c-algo-bit.o: Adapter: bt848 #0 scl: 1  sda: 1 -- testing...
i2c-algo-bit.o:1 scl: 1  sda: 0
i2c-algo-bit.o:2 scl: 1  sda: 1
i2c-algo-bit.o:3 scl: 0  sda: 1
i2c-algo-bit.o:4 scl: 1  sda: 1
i2c-algo-bit.o: bt848 #0 passed test.
i2c-dev.o: Registered 'bt848 #0' as minor 2
bttv0: i2c attach [client=EEPROM chip,ok]
tuner: probing bt848 #0 i2c adapter [id=0x10005]
tuner: chip found @ 0xc2
bttv0: i2c attach [client=Philips NTSC_M (MK2),ok]
tuner: type already set
bttv0: using tuner=17
bttv0: i2c: checking for TDA9875 @ 0xb0... not found
bttv0: i2c: checking for TDA7432 @ 0x8a... not found
bttv0: PLL: 28636363 => 35468950 ... ok
bttv0: registered device video0
bttv0: registered device vbi0
bttv0: registered device radio0

 の,ようになっています.なお,私の環境では, 稼動状況をモニタする MB温度からCPU使用率まで1 のように,i2c を最新版に入れ替えています.そのため, 古い i2c ドライバを使用している場合,若干メッセージの内容が異なる かもしれません.bttv0,tuner がきちんと認識されており,エラーが 出ていないかを確認してください.

 なお,bttvドライバが古く,CardType 81 に GV-BCTV5/PCI が登録されて いない(例:Vine2.5)場合,GV-BCTV4/PCI の設定を拝借し,以下のようにし てとりあえず動かすことができます. ただし,1回目のデバイスの使用 (TVの視聴や録画)は成功するものの,2回目はエラーが出て動かないなど, 動作は不安定でした. bttv ドライバを最新版に入れ替えた方が良いでしょう.

 ちなみに,bttv ドライバおよび i2c ドライバの最新版は, こちらのページから入手できます.

# for BCTV5/PCI (Vine 2.5 bttv)#########################################
alias char-major-89 i2c-dev
options i2c-core i2c_debug=0
options i2c-algo-bit bit_test=1
alias char-major-81 videodev
alias char-major-81-0 bttv
options bttv card=67 radio=1 muxsel=2,3,1,0
options tuner type=17

■AOpen VA1000 lite編
■AOpen VA1000 lite
 TV チューナー搭載カードでは,非使用時であっても,チューナーユニットが かなり発熱します.これはケース内温度の上昇や,Terminator の場合は電源温度 の上昇に直結します.GV-BCTV5/PCI を挿した際に,CPU温度が数度上昇するのが 確認されましたので,少しでもエアフローを改善すべく, Low Profile 対応の AOpen VA1000 liteを購入しました.この製品はカード自身が小型になって いるため,通常のブラケットを使用する場合であっても,エアフローの改善が なされると考えました.

 ただし,このカードは, 商品紹介のページ を読んでも分かるように,機能的に GV-BCTV5/PCI と比較してかなり劣ります. 具体的には,FMラジオ機能が搭載されておらず,TV 放送に関しても,音声は モノラルのみです.また,一応『V.R.M.を搭載することによりノイズを大幅に 軽減』となっており,廉価なカードとしてはそれなりに画質が綺麗でしたが, GV-BCTV5/PCI には劣るように感じられました.温度の上昇を抑える効果も それほどではなかったため,最終的に私は GV-BCTV5/PCI を選択し, VA1000 lite は使用するのをやめました.

 VA1000 lite は Linux での動作実績も豊富ですので,安心確実に動作させたい 場合には選択候補の1つとして考えると良いと思います.しかし,コスト的な面, 機能的な面では玄人志向のカードの方がメリットがありますので,あまり強くは お勧めしません.

AOpen VA1000 lite 外箱
Windows で利用する場合,多彩なソフトが利用可能です
内容一式
Low Profile 対応なカードのため,かなり背が低くなっています. なお,ブラケットは標準タイプが付属
ブラケット側の端子は,映像入力用のS端子,TVアンテナ端子,音声出力,音声入力端子など
カード上のシルク印刷では,VA1000Lite/PLUSとなっています. なお,AOpen のラインナップでは,VA1000 Plus というステレオ対応のカードも ありますが,おそらく基盤は共通なのではないかと思います
使用チップは FUSION 878A
チューナーは PHILIPS 製

■AOpen VA1000 lite 用の bttv の設定
 GV-BCTV5/PCI と比較し,かなり以前から bttv で動作が報告されています. そのため,若干古い bttv ドライバを使用している場合でも,問題なく動作させる ことが可能だと思います.

 以下の設定は,Vine 2.5 で利用した際のものです.GV-BCTV5/PCI のときと 同様,"/etc/modules.conf" に設定します.

# for VA1000 lite#################################################
alias char-major-89 i2c-dev
alias char-major-81 videodev
alias char-major-81-0 bttv
pre-install bttv modprobe -k tuner
post-remove bttv modprobe -r tuner
options tuner type=2 debug=0
options bttv bttv_gpio=1 audiomux=2,0,0,0

 そしてメッセージに以下のようなものが出力されていればカードの認識に 成功しています.


Linux video capture interface: v1.00
tuner: ignoring ISA main adapter i2c adapter [id=0x50000]
bttv: driver version 0.7.100 loaded
bttv: using 4 buffers with 2080k (8320k total) for capture
bttv: Host bridge is Silicon Integrated Systems [SiS] 630 Host
bttv: Bt8xx card found (0).
bttv0: Bt878 (rev 17) at 00:0d.0, irq: 11, latency: 32, mmio: 0xef800000
bttv0: using: BT878( *** UNKNOWN/GENERIC **) [card=0,autodetected]
bttv0: gpio config override: mask=0xffffffff, mux=0x2,0x0,0x0,0x0,0xffffffff
tuner: probing bt848 #0 i2c adapter [id=0x10005]
tuner: chip found @ 0xc0
bttv0: i2c attach [client=Philips NTSC (FI1236 and compati,ok]
bttv0: using tuner=-1
bttv0: i2c: checking for MSP34xx @ 0x80... not found
bttv0: i2c: checking for TDA9875 @ 0xb0... not found
bttv0: i2c: checking for TDA7432 @ 0x8a... not found
bttv0: registered device video0
bttv0: registered device vbi0

※試していないので何とも言えませんが,オーディオドライバの認識がうまく 行っていようなメッセージが出ているため,外部入力(外部Video,Audio IN)が うまく働かないかもしれません.ただし,TVチューナーとしてはきちんと使用 できていました.

■ソフトのインストール
■xawtvのインストール
 まずは,X-window上で TV を視聴するためのソフトをインストールします. このソフトは,間接的に以下で説明する ffmpeg からも使用されますので, 必ずインストールするようにしてください.

 Vine 2.6であれば,VineSeed に xawtv-3.74-0vl1.i386.rpm が ありますので,ring サーバ等からこれをダウンロードし, rpm -ivh xawtv-3.74-0vl1.i386.rpm と,実行してインストール してください.

 ソースからインストールする場合は, xawtv Homepageを 参照してください.

■ffmpegのインストール
 今回,TV録画および FMラジオ録音,他のマシンへのストリーミングには, 設定および運用が楽な ffmpeg を使用することにしました.ffmpeg は 音声として OggMP3 を使用する場合,外部プログラム/ ライブラリを必要とします.そのため,ffmpeg のインストールに先立ち, まずはこれらをインストールしました.(Ogg はそれほど使用する 機会は多くないかもしれません.ただし,MP3 は利用可能にしておいた方が 良いでしょう)

 Ogg を使用するために必要となるのは,libogg,libvorbis です. Vine 2.6 でしたら,VinePlus に以下のファイルが用意されていますので, ダウンロードし,rpm -ivH <RPMファイル名>でインストールします.

    libogg-1.0-0vl1.i386.rpm
    libogg-devel-1.0-0vl1.i386.rpm
    libvorbis-1.0-0vl1.i386.rpm
    libvorbis-devel-1.0-0vl1.i386.rpm
    
 次に音声を MP3 を使用して圧縮する場合ですが,この場合は lame を 必要とします.そして lame のコンパイルのためには, nasm が必要と なります.そのため,まずは VinePlus から nasm をダウンロードし, インストールします.

    nasm-0.98.35-0vl1.i386.rpm
    
 次に lame ですが,sorceforge のミラーサイトは, こちらになります.このページ の "Download the source code" からリンクを辿ってダウンロードページに行き, ソースをダウンロードしてください.なお,rpm (SRPM) ファイルはかなり バージョンが古いものであったため,私は こちらから, lame-3.93.1.tar.gz をダウンロードし,インストールしました. lame のインストールは,次のように行います.

# tar xvzf lame-3.93.1.tar.gz
# cd lame-3.93.1
# ./configure
# make
# make install
# /sbin/ldconfig

 次にいよいよ ffmpeg ですが,ソースは オフィシャルページ からリンクを辿り,tar ボールをダウンロードします.私は ffmpeg-0.4.6.tar.gz を使用しました.

 インストールは以下のように行います.

# tar xvzf ffmpeg-0.4.6.tar.gz
# cd ffmpeg-0.4.6
(MP3 と Ogg を利用可能にする)
# ./configure --enable-mp3lame --enable-vorbis
Install prefix   /usr/local
Source path      /root/ffmpeg-0.4.6
C compiler       gcc
make             make
CPU              x86
Big Endian       no
MMX enabled      yes
gprof enabled    no
zlib enabled     yes
mp3lame enabled  yes
vorbis enabled   yes
a52 support      yes
a52 dlopened     no
Video hooking    yes
Imlib2 support   no
Creating config.mak and config.h
# make
# make install

 エーラーが出た場合は,適時 fix してください.インストールが正常に 終了すると,/usr/local/bin 以下に ffmpeg,ffserv 等がインストールされます.

■設定と利用
■xawtv の設定
 xawtv を使用して TV を視聴するためには,home ディレクトリ直下に ".xawtv" という名前で設定ファイルを置いておかなければなりません. また,xawtv は X-Window 上で動作しますが,TV 画面表示のために fb (frame buffer) が利用可能でなければなりません.適切な設定が されておらず,TV画面が表示されずにエラーが出る場合は, "/etc/X11/XF86Config","/etc/X11/XF86Config-4"ファイルを 設定し直してください.

 ちなみに私の Terminator TU では, XF86ConfigXF86Config-4のように なっています.なお,この設定ファイルでは 画面表示モードは 1600x1200 24bit で表示するように しているほか,モニタのリフレッシュレートを高めに設定しています. 使用しているモニタに合わせ,適切な設定に書き換えて使用するように してください.古いモニタの場合,そのまま使用すると 故障する可能性があります.

 ".xawtv" には,利用可能なチャンネル等の情報を記述します.私は CATV 接続で TV を視聴しているのですが,日本国内で TV を視聴する場合は,ほぼ 同じ設定で動くと思います.TV 画面上下にチラチラとノイズが乗る場合, 設定ファイルに周波数を記述し,微調整してみてください.なお,私の環境 では Video 入力はテストしていません(WowWow を入れたいのですが,チューナー の場所が遠いので…).もし必要な場合は,以下のように追記してください.

[VIDEO]
source = Composite1
key = v

[SVHS]
source = SVHS
key = s

 私の使用している".xawtv"ファイルは,このように なっています.画質調整などは適時自分の環境に合わせて調整してみてください.

■xawtv の使用
 ".xawtv" 設定ファイル作成後,xawtv コマンドを実行することにより,TV を視聴することができるはずです.ffmpeg を使用する前に,xawtv できちんと TV が視聴できるかを確認しましょう.

 以下の例は Eden (EPIA-5000) で VA1000 lite を使用して TV を視聴している画面をキャプチャしたものです. EDEN は C3 533MHz という非常に非力な CPU を搭載していますが,このような 環境下でも,パフォーマンス的に問題なく TV を観ることができます.

xawtv 実行画面(小さい window で表示)
xawtv 実行画面(大きい window で表示)
クレームが付きそうなので,一部モザイクをかけています
xawtv 調整画面.
マウスのミドル,右クリック等でメニューを 表示することができます.

 表示品質的には,普通に鑑賞する分には問題ないレベルです.ただし, BT チップは,コントラストが高くなってしまい,白飛びしやすいという 問題があります(.xawtv で bright 等を調整しても限界がある).また, 3番目の画像のように,受信状況が悪い場合はどうしようもなくメタメタな 画像になってしまいますが,これは TV でも同じです.アンテナ線の 取り回し等に気を付けましょう.

※JPEG圧縮率を高めにしているため,上記画像はかなり画質がスポイル されています.また,動画として見た場合には問題ないレベルであって も,静止画として見た場合には画質が悪く感じる場合もあります.例えば 3番目の画像では,ソースがインターレースのため,櫛形ノイズが出ていて 汚く見えますが,動画としては普通に鑑賞できる品質です.

 なお,上記画像では輪郭が滲んで見えると思いますが,GV-BCTV5/PCI で あれば,かなり改善されます.とは言え,MTV2000 をはじめとする 3次元Y/C分離機能を搭載したカードとは比較になりませんが….

■ffmpeg を使用した TVの録画
 ffmpeg がきちんと動作するかを確認するために,まずは ffmpeg を 使用し,1ch の TV放送を60秒間録画してファイルに記録してみること にします.なお,ビデオの圧縮 codec として,高圧縮率かつ高画質で 定評のある,DivX を使用することにします.録画したファイルを再生する Windows マシンには, DivX のダウンロードページ からダウンロードした DivX,あるいは DivX pro を予めインストール しておいてください.Linux 上で再生するためには,MPlayer 等を インストールする必要がありますが,こちらに関しての解説は 省略します.

# /usr/bin/v4lctl setchannel 1
(TV の 1ch にチューナーをセット)
# /usr/local/bin/ffmpeg -f avi -vcodec mpeg4 -acodec mp3 -y\
> -b 1000 -ab 128 \
> -r 30 -s 352x240 -ar 44100 -ac 2 /tmp/sample.avi -t 60
Input #0, video_grab_device, from '/dev/video':
  Stream #0.0: Video: rawvideo, yuv420p, 352x240, 30.00 fps, 800 kb/s
Input #1, audio_device, from '/dev/dsp':
  Stream #1.0: Audio: pcm_s16le, 44100 Hz, stereo, 1411 kb/s
Output #0, avi, to '/tmp/sample.avi':
  Stream #0.0: Video: mpeg4, 352x240, 30.00 fps, q=2-31, 1000 kb/s
  Stream #0.1: Audio: mp3, 44100 Hz, stereo, 128 kb/s
Stream mapping:
  Stream #0.0 -> #0.0
  Stream #1.0 -> #0.1
Press [q] to stop encoding
frame=  315 q=16.0 size=    1610kB time=10.4 bitrate=1262.1kbits/s
(最後の行が逐次updateされ,時間が経つと自動的に終了する)

 今回使用した ffmpeg のパラーメータに関して説明すると,以下のように なります.

使用したオプション説明
-f aviAVI 形式で保存
-vcodec mpeg4ビデオの圧縮 codec として,DivX codec を使用
-acodec mp3音声の圧縮 codec として,MP3 (lame) を使用
-y書き出しファイルが存在した場合は上書き
-b 1000ビデオのビットレートを 1000[kbps]に指定
-ab 128音声のビットレートを 128[kbps]に指定
-r 30動画のフレームレートを 30[fps]に指定
-s 352x240動画の画像サイズを 352x240[pixel] に指定
-ar 44100音声のサンプリングレートを 44100[Hz] に指定
-ac 2音声をスレレオ(2ch) で取り込み
/tmp/sample.avi/tmp/sample.avi に書き込め
-t 6060秒間キャプチャせよ

 なお,ffmpeg で使用できる各オプションは,ffmpeg -h を実行する ことにより表示可能であり,利用可能な codec は,ffmpeg -formats で 表示することができます.

 録画したファイルは,DivX codec がインストールされた Windows マシンに 転送し,Windows Media Player で再生することが可能です.

VA1000 lite でキャプチャしたものを,後述する ffserver でストリーミング (後述)したものを表示した例.若干輪郭に滲みが出る
GV-BCTV5/PCI でキャプチャした動画を Windows 上で MediaPlayer で再生
上の画像は MS-MPEG4,この画像は DivX という違いもありますが, VA1000 lite よりも画質は良いのが分かると思います.

 なお,ffmpeg はキャプチャーデバイスから直接取り込むほかに,既に存在 動画/音声ファイルを読み込み,別形式に再エンコードすることも可能です. 例えば,暗号化されていない DVD-video の vob フォーマット画像を,DivX 形式に変換すること等も可能です.

■FMラジオの再生
 FMラジオチューナー搭載のキャプチャカードを 利用している場合,xawtv をインストールすることにより,FM ラジオを聞く ことも可能になります.xawtv にはネーミング からしてそのものズバリの radio というコマンドが含まれており, このコマンドを使用して周波数チューニングすることになります.

 ただし,本来であれば,このコマンドを使用すれば, CUI 上で周波数を 設定するだけでラジオが聞ける筈なのですが,GV-BCTV5/PCI では, チューニングは出来ましたが,音声は再生されませんでした.どうも音声が 自動的にミュートになって しまうようです.そのため,FMラジオを聞く場合は,以下のようにコマンドを 組み合わせて音声を再生するようにしました.

# /usr/bin/radio -qf 80.2
(チューナーを FM放送 80.2MHz にチューニング)
# /usr/bin/v4lctl volume mute off
(ミュートをOFFに.つまり,音声を再生)

 このままですと FM放送がスピーカーから再生され続けます.音声再生を 停止する場合,次のようにコマンドを実行します.

# /usr/bin/v4lctl volume mute on
(音声をミュート.つまり,音声再生中止)

 なお,当然ながら, FMラジオチューナーが内蔵されていない TVチューナー カードでは,FMラジオを再生することができません.そのため,VA1000 lite では,FMラジオを聞くことはできません.

■FMラジオの録音
 FMラジオが再生可能である場合,録音を行うことも可能です.その際には, ffmpeg を使用することにより,任意の圧縮形式にリアルタイムで圧縮しながら 保存することも可能です.例えば次のように実行します.

# /usr/bin/radio -qf 80.2
(チューナーを FM放送 80.2MHz にチューニング)
# /usr/bin/v4lctl volume mute off
(ミュートをOFFに)
# /usr/local/bin/ffmpeg -f mp3 -acodec mp3 -y -vn\
> -ab 128 -ar 44100 -ac 2 -t 60 /tmp/fm802.mp3
Input #0, audio_device, from '/dev/dsp':
  Stream #0.0: Audio: pcm_s16le, 44100 Hz, stereo, 1411 kb/s
Output #0, mp2, to '/tmp/fm802.mp3':
  Stream #0.0: Audio: mp3, 44100 Hz, stereo, 128 kb/s
Stream mapping:
  Stream #0.0 -> #0.0
Warning, allocating 0 bytes
Press [q] to stop encoding
size=      67kB time=4.3 bitrate= 127.8kbits/s

(最後の行が逐次updateされ,時間が経つと自動的に終了する)

 録音終了後もラジオ音声が再生され続けますので,v4lctl コマンドを使用し, 音声出力を mute するようにしてください.

 一部前述したものと重複しますが, ffmpeg のパラーメータに関して説明すると, 以下のようになります.

使用したオプション説明
-f mp3mp3 形式で保存
-acodec mp3音声の圧縮 codec として,MP3 (lame) を使用
-y書き出しファイルが存在した場合は上書き
-vnVideo は使用しない(オーディオのみ記録)
-ab 128音声のビットレートを 128[kbps]に指定
-ar 44100音声のサンプリングレートを 44100[Hz] に指定
-ac 2音声をスレレオ(2ch) で取り込み
/tmp/sample.avi/tmp/fm802.mp3 に書き込め
-t 6060秒間録音せよ

 録音された音声ファイルは,Linux 上であれば mpg123,Windows 上で あれば,MediaPlayer 等で再生可能です.

■ストリーミング
■別のマシンでの再生
 ここまで,FMラジオや TV を録音/録画し,ファイルに書き込む方法 に関して解説して来ました.しかし,録画済みのファイルを別のマシンで再生 したいといった場合や,今放送されている番組を別のマシンで見たい といったニーズもあるのではないかと思います.

 私の場合,サーバはサーバとして稼働させ,直接そのサーバ上でこれら ファイルを再生することはまずありません.大抵は別のマシン,それも Windows マシンで再生しています.

 まずは別のマシンで録画済みのファイルを別マシンで鑑賞する方法ですが, 最も手っ取り早いのは,sambaでファイル共有をしている場所にファイルを保存し ておき,クライアントマシンはそのファイルを直接再生する方法です.別の 方法としては,ファイルをクライアントマシンに転送し,転送後にローカル ディスク上のファイルを再生する方法です.

 後者の場合,動画ファイルは大抵大きなファイルサイズとなるため,転送 待ち時間が大変苦痛になるのではないかと思います.また,前者の場合, 共有ディスクの設定をし,利用者はそれをマウントし…と,準備に若干手間 がかかります.そこで,『今放送されている番組を別のマシンで見たい』と いったニーズの解決も含め,ストリーミングを行うことによって, 手軽に他のマシンから鑑賞する方法について解説します.

■ffserverの設定と利用
 ffmpeg パッケージには,ffserver というストリーミングを行うための ソフトが含まれています.このソフトは,ffmpeg と連携することにより, 音声や動画を,様々なフォーマット(RealやASF等)でストリーミングすること が可能です.

 ffserver を使用するためには,まずは ffserver の設定ファイルを作成 する必要があります.設定ファイルのサンプルは,ffmpeg の tar ボールを 展開したディレク トリ下の,doc/ffserver.conf にあります.このファイルにはコメントもきちん と書かれておりますので,一読すれば行えることが一通り理解できると思い ます.しかし,これを修正すれば大抵のことが出来るようなサンプルに なっていますが,余計な記述を残しておくと不安定になる場合も多いため, スクラッチから必要な設定のみを記述していくのが良いと思います.

 なお,私の環境では,RealAudio/RealVideo に関し,ビットレートを変更 すると正常にクライアントが受信できなかった(RealOneがフリーズを起 こしたりする)ため,ASF 形式のみを使用し,Media Player で鑑賞可能 するように設定しました.以下に,ffserver.conf の例を示します.

Port 10080
BindAddress 0.0.0.0
MaxClients 1000
MaxBandwidth 10000
CustomLog -
NoDaemon

<Feed feed1.ffm>
File /tmp/feed1.ffm
FileMaxSize 200K
ACL allow 127.0.0.1
</Feed>

# ASF compatible
<Stream tv.asf>
Feed feed1.ffm
Format asf
VideoFrameRate 30
VideoSize 352x240
VideoBitRate 1000
VideoGopSize 30
AudioBitRate 128
StartSendOnKey
AudioChannels 2
AudioSampleRate 44100
</Stream>

<Stream radio.asf>
Feed feed1.ffm
Format asf
AudioBitRate 32
StartSendOnKey
AudioChannels 1
AudioSampleRate 22050
NoVideo
</Stream>

<Stream stat.html>
Format status
ACL allow localhost
ACL allow 192.168.0.0 192.168.0.255
</Stream>

<Redirect index.html>
URL http://ffmpeg.sourceforge.net/
</Redirect>

 設定内容の説明は,重要な部分のみに止めます.まずストリーミングは 10080 ポートで行い,feed 用ファイル( ffserver のワーク用ファイル)は /tmp/feed1.ffm に設定.ストリーミングは2形式で行い,動画と音声を tv.asf として流す他, 音声のみを radio.asf として流す.そしてステータスファイルの表示も行うという 設定です(あ,ACL で deny を書き忘れてた…).
 ちなみに radio.asf は外部からアクセスすることを考え,ビットレートを 32kbps に押さえてある(なにせ私のところはフレッツ ISDN なので…)ほか, サンプリングレート 22.05kHz のモノラルとしています.LAN 上で流したり, ADSL 接続であれば,それぞれ 128kbps, 44.1kHz, 2ch にした方が良いでしょう.

 これを /etc/ffserver.conf として保存し,まずは ffserver を バックグラウンドで起動します.

# /usr/local/bin/ffserver &
ffserver started.

 エラーが出ていなければ起動成功です.

 次に,ffmpeg を起動し,ffserver にデータを渡します.例えば FMラジオ (80.2MHz)をストリームで流す場合は,次のように行います.

# /usr/bin/radio -qf 80.2
# /usr/bin/v4lctl volume mute off
# /usr/local/bin/ffmpeg http://localhost:10080/feed1.ffm
127.0.0.1 - - [Thu Mar 27 15:33:36 2003] "GET /feed1.ffm HTTP/1.0" 200 8245
Input #0, video_grab_device, from '/dev/video':
  Stream #0.0: Video: rawvideo, yuv420p, 352x240, 30.00 fps, 800 kb/s
Input #1, audio_device, from '/dev/dsp':
  Stream #1.0: Audio: pcm_s16le, 44100 Hz, stereo, 1411 kb/s
Output #0, ffm, to 'http://localhost:10080/feed1.ffm':
  Stream #0.0: Audio: mp3, 44100 Hz, stereo, 128 kb/s
  Stream #0.1: Video: msmpeg4, 352x240, 30.00 fps, q=3-31, 1000 kb/s
  Stream #0.2: Audio: mp3, 22050 Hz, mono, 32 kb/s
Stream mapping:
  Stream #1.0 -> #0.0
  Stream #0.0 -> #0.1
  Stream #1.0 -> #0.2
Press [q] to stop encoding
frame=  264 q=3.0 size=     196kB time=8.8 bitrate= 182.9kbits/s

※ffserver の設定を変更した場合,ffmpegの引数として渡した 『http://localhost:10080/feed1.ffm』は, 設定ファイルに記述したポート番号,feed 用ファイル名に置き換えて ください.

 このように,エラー無く実行されたら,ストリーミングが成功しています. Internet Explorer 等で,『http://サーバホスト名:設定したポート番号/stat.html』 にアクセスしてみてください.以下のようなページが表示されるはずです.


ステータス表示画面

 このステータス画面で,どのようなストリーミングが行われているかや, どのような設定でストリーミングされているかが表示されます.そして, この画面で tv.asf や radio.asf をクリックすれば,MediaPlayer が起動し, ストリーミング(この例では FMラジオをストリーミングしていますので, tv.asf をクリックしても動画は流れてきませんが)で鑑賞できるはずです. なお,MediaPlayer から直接URLを入力しても再生することができます.

 TVを観る場合には,上記のように ffmpeg を実行せず,v4lctl コマンドで チャンネルを設定し,ffmpeg の起動時のパラメータを以下のように指定する 必要があります.
 なお,以下の例では音声のサンプリングレートなどを一通り指定していますが, 指定しない場合に音声がうまくストリーミングされないことがあったため,この ように指定するようにしています.

# /usr/bin/v4lctl setchannel 1
# /usr/local/bin/ffmpeg -r 30 -s 352x240\
> -ar 44100 -ac 2 http://localhost:10080/feed1.ffm

 MediaPlayerで再生すると,以下のようになります.ちなみにこれは VA1000lite を使用し,Video:2000kbps, Audio:64kbps でストリーミングしたものですが, かなり画像が汚くなっています.Video を 1000kbps に落としても画質は殆ど 変わりませんので,ビットレートの不足ではなく,ビデオキャプチャの品質 および圧縮 codec が原因の画質劣化だと思われます.(GV-BCTV5/PCI を使用し, DivX で圧縮した場合,ビットレートが低くても綺麗に記録されます)

 とは言え,普通に観る分には問題ないクオリティが確保されています.


Media Player で TV 放送をストリーミングしているものを再生している画面

■録画したファイルをストリーミング
 リアルタイムで FMラジオおよび TV 放送をストリーミングする方法に関して 解説しましたが,同様に,既に録音/録画したファイルをストリーミングするこ とも可能です.この場合には,ffserver 実行後,以下のように ffmpeg を実行 します.

# /usr/local/bin/ffmpeg -i 動画ファイル名\
> http://localhost:10080/feed1.ffm

■予約録音/録画
■構想
 リアルタイムでTVが鑑賞でき,録音および録画も可能になり,また, 他のマシンからも視聴できるようになったとしたら,次なるハードルは 予約録音/録画です.これが完成すれば,AV サーバとして実用的なものに なると思います.

 この機能を実装するために必要なものとしては,以下のようなものが 挙げられると思います.

  • 録音/録画時に,任意のチャンネル,任意のクオリティが選択できること
  • 予約を登録する機能
  • 予約時間が来たら,自動的に予約を開始する機能

 これらを実現するために,録音/録画時に前述したような各種 パラメータをいちいち入力するのは面倒ですので,まずは ffmpeg の簡易 フロントエンドとして動作するスクリプトを作成することにします.次に, 予約はテキストファイルに記録することにし,cron で定期的に起動する プログラムを作成して,予約時間が来た際に自動的に録音/録画開始するよう 設定します.これらが実現できたら,最低限の予約録音/録画が可能になり ます.

■ffmpeg の簡易フロントエンド
 フロントエンドとは言え,毎回利用するオプションを省略して実行可能な スクリプト程度のものです.例えば私の場合,TV録画のために以下のような シェルスクリプトを作成し,/usr/loca/bin/tvrec.shに起きました.なお, chmod +x /usr/local/bin/tvrec.shを実行し,ファイルの実行フラグを 立てるのを忘れないようにしてください.

#!/bin/sh
CHANNEL=$1
ACODEC=$2
ARATE=$3
VCODEC=$4
VRATE=$5
ACHANNEL=$6
FFORMAT=$7
RECTIME=$8
FILENAME=$9
# set TV channel
/usr/bin/v4lctl setchannel $CHANNEL
# record start
/usr/local/bin/ffmpeg -f $FFORMAT -vcodec $VCODEC -acodec $ACODEC -y\
   -b $VRATE -ab $ARATE \
   -r 30 -s 352x240 -ar 44100 -ac $ACHANNEL $FILENAME -t $RECTIME

 殆ど使い方の説明は必要無いと思いますが,例えば 1ch の TV 放送を, 音声は MP3 128kbps stereo,動画は DivX 1000kbpsでキャプチャし, AVI 形式で 1時間分 /tmp/1ch.avi に記録する場合,以下のように 実行します.
 なお,普段使用する,動画のサイズや音声および動画のレートを変更 したい場合,スクリプト側を修正するようにしてください.

tvrec.sh 1 mp3 128 mpeg4 1000 2 avi 3600 /tmp/1ch.avi

 次に,FM ラジオ録音用のスクリプトです.こちらは /usr/local/bin/radiorec.shに置きました.こちらも同じように, 実行フラグを立てるのを忘れないようにしてください.

#!/bin/sh
FREQ=$1
ACODEC=$2
ARATE=$3
ACHANNEL=$4
FFORMAT=$5
RECTIME=$6
FILENAME=$7
# set FM Radio frequency
/usr/bin/radio -qf $FREQ
# mute off
/usr/bin/v4lctl volume mute off
# record start
/usr/local/bin/ffmpeg -f $FFORMAT -acodec $ACODEC -y -vn\
   -ab $ARATE -ar 44100 -ac $ACHANNEL -t $RECTIME $FILENAME
# mute on
/usr/bin/v4lctl volume mute on

 80.2MHz の放送を MP3 128kbps stereo で1時間,/tmp/802.mp3 に MP3 形式で録音する場合は,以下のように実行します.

radiorec 80.2 mp3 128 2 mp3 3600 /tmp/802.mp3

■予約登録プログラム
 とりあえず今回は,エディタを使用して,テキストファイルで予約リストを 作ることにしました.いずれは Web 版インターフェイスを作成しようと思っています.

 なお,私の作成したプログラムでは,以下のようなフォーマットのファイルを 食わすようにしています.

2003 4 1 19 45 0 - 80.2 mp3 - mp3  64 1 0 300 /tmp/4_1_802.mp3
2003 4 1 20 00 1 1 - mp3 mpeg4 avi 128 2 1000 3600 /tmp/4_1_20pm_1ch.avi
…
(年 月 日 時 分 Radio/TV(0/1) TVチャンネル FM周波数 Audio_codec
 Video_codec ファイル形式 Audio_bitrate Audio_channel Video_bitrate
 録音/録画時間 記録ファイル名)

■予約ハンドリングプログラム
 予約リストファイルを読み込み,時間が来たら自動的に前記スクリプトを起動 して予約するプログラムです.

 プログラム本体に関しては,現在,C から Perl に書き換えている最中なので しばしお待ちを….とりあえず自分のやりたいことは出来ているので,最近多忙 なこともあって公開は遅くなるかも.リクエストが多ければ,現状のものサクッと 公開するかもしれませんが…

 そしてハンドリングプログラムは,root 権限で crontab に記述することに より実行します.例えば,5分毎に起動して予約時間になっていれば開始する ようにするためには,以下のように crontab に記述します.なお,このような 構造にしている関係上,録画開始時刻は5分刻みで指定する必要があり,例えば 『8:02分録画開始』のような設定はできません.(録画終了時間はこのような制約 はありません)

 crontab -eコマンドを実行し, crontab に下記エントリーを追加してください.

*/5 * * * * /usr/local/bin/sc_recorder > /dev/null

 なお,一応書いておきますと,本プログラムは サスペンドから復帰して予約開始するようなことはできません.常に マシンは稼働している必要があります.

■まとめ
 と,このようなことを行うことにより,Linux をベースとしたマシンで, FM ラジオや TV が楽しめる環境が整いました.しかし,TV録画に関しては, 画質や使い勝手などの面で,Windowsベースの環境にはかなり劣るかと思い ます.特に,カノープスの MTV シリーズを使用した録画システムであれば, 画質はピカイチですし,圧縮は MPEG2 ハードウエアエンコードのためコマ 落ちが無く,また,サスペンド状態から復帰しての予約録画も可能です.

 今回使用したチューナーカードは,ソフトウエアコンコードのカードで あるため,CPU の負荷等によっては,コマ落ちや画質の低下が発生します. 私の Terminator TU では,Pentium3-S/1.26GHz を使用していますが, 色々と試した限りでは,352x240 サイズでのキャプチャが実用的な限界 でした(NTSC の解像度を考えると,充分であるとも言えます).また, 普通の状態であればコマ落ちは殆ど発生しませんが,それでも発生しない わけではありません.

 かれこれ2ヶ月ほど実運用をしていますが,画質を求める場合は家電の DVD-RAMレコーダで予約録画することにし,多少画質が落ちても良いものに 関しては,PCで録画するような使い分けをしています.

 さて,今後可能であればしたいこととしては,

  • 録音/録画予約のWebインターフェイス.携帯からの予約も可能にしたい
  • 録画済みのファイル管理.エクスプローラみたいなものの作成

 辺りを考えています.しかし,最近多忙過ぎ,なかなか趣味のプログラ ミングの時間が取れないのが辛いです….最終形態の完成はいつになることやら…

['04/1/04 追記]
 ソフトエンコードカードを用いた録画サーバ構築プロジェクトは 放棄しました.現在は MPEG2 ハードウエアエンコーダを搭載したカードを 使用し,Linux でTV録画環境を構築中です.詳しくは Linuxで最強のテレビ録画サーバを目指す【2】-ハードウエアMPEG2キャプチャ- にまとめてありますので,よろしければご一読下さい.


『Asus Terminator 活用メモ』 へ戻る