TV電話を楽しもう

以前、本誌No.5でマルチキャストアプリケーションの紹介がありました。 これらのアプリケーションはユニキャストでも利用可能です。 今回は、これらのアプリケーションを使ってTV電話を実現してみようと思います。

音声の転送

ここではTV電話に欠かせない音声の転送について考えます。 はじめに、音声入出力のためのサウンドカードをFreeBSDで利用する方法について説明し、 そのあとでアプリケーションについて説明します。

サウンドカードの設定

FreeBSDでサポートされているサウンドカードは、 /usr/src/sys/i386/conf/LINTman sndなどを参照してください。 標準でサポートされているカードの他にもOSS (http://www.opensound.com/freebsd.html) を利用することで最新のサウンドカードも利用できるかもしれません。 ノートパソコンなどの場合は、こちらで対応されていることが多いでしょう。 詳細はPersonal UNIX No.2「PC-UNIXサウンドガイド」などを参考にしてください。

カーネルの再構築で設定をする場合は、

	  device          pcm
	
を付け加えます。 正常に認識された場合、例えば以下のようにdmesgに表示されます。
	  sbc0: <ESS ES1868> at port 0x220-0x22f,0x388-0x38b,0x330-0x331 irq 5 drq 1,0 on isa0
	  pcm0: <ESS 18xx DSP> on sbc0
	
最後に、デバイスファイルを作成します。 以下のようにすることで、関係するデバイスファイルが全て作成されます。
	  > cd /dev;./MAKEDEV snd0
	

カーネルモジュールを動的にロードすることで、 カーネルの再構築を行わずに利用できることもあります。 この場合、以下のようにしてカーネルモジュールを読み込みます。

	  > kldload snd.ko
	
成功すれば先程のようなメッセージが表示されます。 デバイスファイルの作成は忘れないでください。 起動時に常に読み込みたい場合には、 /boot/loader.confに 以下のように記述しておきます。
	  snd_load="YES" 
	

OSSの場合は、サイトからダウンロードしたアーカイブを展開して、 そこに含まれるoss-installを スーパーユーザで実行します。 既に他のサウンドドライバが組み込まれている場合にはインストーラが動作しませんので、 それを使わないようにしておく必要があります。 最近のインストーラはXで動かすとGUIを使って操作が可能です (図1)。 ライセンスへの同意、リリースノートの表示の後に インストールするディレクトリを選択します。 PCIやISA PnPのデバイスではIRQやI/Oベースはデフォルトのもので大丈夫でしょう。 正式に使い続けるにはサイトからライセンスを購入してください。 インストールが終わった後でsoundonを実行すると、 ドライバが組み込まれます。

図 1. OSSのインストーラ:画面はインストールディレクトリの選択

音声転送アプリケーション:rat

音声転送アプリケーションには、ここで紹介するrat以外にも Speak Freely (http://www.speakfreely.org/: mbone/speak_freely) と vat(mbone/vat) があります。 後者は既に開発が止まってしまっているので、あまり使う機会は無いでしょう。 前者は基本的にコマンドラインで操作するタイプのツールで、 現在でも開発が行われています。 現時点でのportでは、Release 7.1が入っていますが、 Release 7.2ではGUIによる操作ツールも含まれています。 ここでは、比較的多機能なratについてのみ説明します。

FreeBSD portsには、2つの rat (http://www-mice.cs.ucl.ac.uk/multimedia/software/rat/) が入っています。 4.2.13(mbone/rat)と 3.0.35(mbone/rat30)です。 前者は高品質オーディオ版で、 後者は総合性能オーディオ版という位置付けになっています。 4.2.13は、IPv6に対応していたり、 サンプリングレートが変えれたり、 扱えるオーディオファイル形式が多かったりと多機能になっています。 後者は、統合会議環境であるReLaTe(mbone/relate) で利用するために残されています。

コマンドラインからの実行は、以下のように"ホスト名/ポート番号"で行います。

	  > rat hostname/10000
	
ホスト名部分はマルチキャストアドレスの利用も可能です。 ポート番号は通信先とあらかじめ適当に決めておく必要があります。 起動時にはマイクからの入力は送信されていませんので、 Talkボタンを押す必要があります。

音楽などの連続したオーディオを流す場合は、 [Options...]ボタンから [Audio]メニューを選び、 Silence SupressionをOffにしておくと、 途切れず流れます。

帯域に関連する項目は、 [Options...]ボタンから表示されるウインドウの [Transmission], [Reception], [Audio], [Codecs] に含まれています。

図 2. ratのユーザインタフェース

ビデオを転送する

ビデオ転送は、やはり帯域を必要とします。 毎秒あたりのフレーム数や画像の品質をコントロールして、 帯域にあったビデオ転送を行うようにしましょう。 ここでは、動画転送ソフトウエアだけではなく、 静止画転送ソフトウエアを定期的に実行することで、 チープな画像転送を実現することを考えてみます。

ビデオデバイスの設定

現在、FreeBSDでビデオ入力をしようと思うと、 Brooktree bt848/848a/849a/878/879を利用した bktrデバイスを利用することがほとんど唯一の選択になります [1]。 これらのデバイスは、安いものでは数千円から手に入ります。 一部のUSBのカメラは、 vid(graphics/vid)などを用いて、 静止画でのキャプチャーができるようになっていますが、 ビデオ転送ソフトウエアの対応ができていませんので、 現状では利用できません。 動画ではありませんが cronなどを使って1分毎の画像を送ったり、 シェルスクリプトで数秒程度の間隔で画像を送ることは可能です。

bktrの場合

カーネルの再構築を行う場合、設定ファイルに

	    device bktr
	  
を追加して再構築します。

カーネルモジュールをロードして利用する場合、以下のようにします。

	    > kldload bktr_mem.ko
	    > kldload bktr.ko
	  
/boot/loader.confでの設定は、以下のようになります。
	    bktr_mem_load="YES"
	    bktr_load="YES"
	  

最後にデバイスファイルの作成も忘れないでください。

	    > cd /dev;./MAKEDEV bktr0
	  

OV511を使ったUSBカメラの場合

vidで利用できるカメラはOV511ベースのものになります。 このようなデバイスは、最近では数千円で入手可能です。 Linuxでは既にドライバが存在し [2] 、ビデオ中間レイヤであるVideo4Linuxを利用することで vicなどで利用することも可能になっています。 残念ながら現在のFreeBSDにはこのような中間レイヤが無いため、 個別に対応する必要があります。 これらのカメラは、ugenとして認識されますので、 対応されるデバイスがカーネルに組み込まれていることを確認します。 基本的に現在のGENERICカーネルには含まれていますが、 以下のような項目を確認してください。

	    device          uhci            # UHCI PCI->USB interface
	    device          ohci            # OHCI PCI->USB interface
	    device          usb             # USB Bus (required)
	    device          ugen            # Generic
	  
デバイスファイルの作成も忘れないでください。
	    > cd /dev;./MAKEDEV ugen0
	  

ビデオ転送アプリケーション

vic

マルチキャストが利用可能な画像転送ソフトウエアとしては vic 2.8ucl-1.1.3 (http://www-mice.cs.ucl.ac.uk/multimedia/software/vic/:mbone/vic) があります。 ratと同じように、"ホスト名/ポート番号"を指定して 実行します。

	    > vic hostname/20000
	  
デフォルトの設定では転送に必要な帯域は128kbpsです。

帯域の調整は、メニューウインドウの Rate Controlを使います。 上部のkbps表示部分で利用する帯域が決まります。 下は毎秒あたりのフレーム数になります。 帯域を下げた状態でフレーム数をあげても、 実際に転送されるフレーム数は上がらないので注意してください。 更に画像の品質を落していい場合は、Encoder部分で、 smallを選択してください。 更に、Qualityを小さな値にすることで 画質が悪くなる変わりに利用帯域を減らすことが可能です。 Encoding方式を変えることで、同じ大域幅でも画質がかなり変わりますので、 必要に応じて変えてみてください。

図 3. vicのインターフェース

その他のツール

Webブラウザを利用して動画像を転送するシステムとしては Camserver 0.42 (http://cserv.sourceforge.net/: graphics/camserv ) があります。 フレーム数などは設定ファイルでコントロールできますので、 帯域が小さい場合でもそれなりに画像を送ることができます。 くわしくは、本誌No.1の新着Ports selectionを参照してください。 最大転送フレーム数(maxfps)を小さく設定することで、 少ない帯域での転送が可能です。

OV511+を用いたUSBカメラ静止画キャプチャソフトウエアとしては、 vid 1.0.1 (http://ovtvid-bsd.sourceforge.net/) があります。 画像は標準出力にppmファイルとして出されますので、 適宜必要な形式に変換する必要があります。 例えば、jpegファイルにしたい場合は、以下のようにします。

	    > vid |cjpeg > image.jpg
	  
portのvidでは、 コントラスト制御などが入っていませんので、 カメラによっては暗い画像が表示されてしまいます。 portsにはなっていませんが、 vid+ (http://www.mons.net/?c=15&p=30) や、 OmniVision OV511+ Camera (http://key.unixmagic.org/cmptr/ov511+.html) の情報などを参考にすることでCMOSイメージセンサによってはコントラスト制御 などが可能になります。 Webブラウザで画像を見る場合、定期的に更新する必要があります。 これを行うためには、metaタグを利用して画像の更新頻度にあわせて Refreshすれば良いでしょう。 以下のようにすれば1分毎の更新が可能です。
<html>
  <head>
    <title>Image</title>
    <meta http-equiv="Refresh" content="60;URL=./">
  </head>
  <body>
    <h1>画像</h1>
    <img src="image.jpg">
  </body>
</html>
	  
画像の定期的な取得には、cronを使う方法と シェルスクリプトを作成する方法があります。 前者では1分毎にしか取得できませんし、 後者でも最大1秒毎に取得することしかできません。 前者の場合、crontab -eして以下のようなエントリを入れておきます。 最初の項目の"*/1"で1分毎という意味になります。
	    */1 * * * * /usr/local/bin/vid | /usr/local/bin/cjpeg > /somewhere/image.jpg
	  
後者の方法はいろいろありますが、 例を図4に示します。 定期的に取得するためにsleepを使っています。

図 4. vidで10秒毎に画像取得するシェルスクリプト例

#!/bin/sh
while true
do
    vid | cjpeg > image.jpg
    sleep 10
done	    
	  

他にも、デジタルカメラからキャプチャするソフトウエアが graphicsカテゴリにはいくつかあります [3]。 シャッタをコンピュータ側から切ることができるのであれば、 vidの所で説明したような方法が利用できます。

TV電話を実現する

いままでの説明で音声と画像を個別に楽しむことができるようになりました。 これらのアプリケーションを手動で立ち上げればTV電話が実現できますが、 ここはひとつ簡単なシェルスクリプトを書いて、 両方をコマンドひとつで立ち上げられるようにしてみましょう (図5)。

ここで使った機能は以下のとおりです。

図 5. TV電話スクリプト

#!/bin/sh
# $Id: TVphone.sh,v 1.1 2003/08/01 00:31:47 mutoh Exp $
### 変数の設定
BROWSER=w3m
port=10000
mode="vic"
### コマンドラインオプションの取り扱い
# 数のチェックとUsage(利用法)の表示
if [ $# -lt 1 ]; then
  echo "Usage: $0 [-u] [-c] [-v] [-d directory] [-p portbase] hostname"
  echo "  -v: vic mode(default)"
  echo "  -u: vid mode"
  echo "  -c: camserv mode"
  exit 2
fi
# 実際の取得
args=`getopt cuvd:p: $*`
set -- ${args}
for i
do
  case "${i}"
  in
    -c)
      mode="camserv"; shift;;
    -u)
      mode="vid"; shift;;
    -v)
      mode="vic"; shift;;
    -d)
      dir="$2"; shift; shift;;
    -p)
      port="$2"; shift; shift;;
    --)
      shift; break;;
  esac
done
### 接続ホスト名やURLの設定
hostname=$1
URL="http://"${hostname}${dir}
### ratの実行
rat ${hostname}/${port} &
pid=$!
### ビデオ(?)ビュアーの起動
case "${mode}"
in
  vic)
    vic_port=`expr ${port} + 10`
    vic ${hostname}/${vic_port};;
  *)
    ${BROWSER} ${URL};;
esac
### ratの終了
kill -9 ${pid}

おわりに

音声と画像を転送するためのアプリケーションについて説明しました。 フレッツシリーズなどを利用した常時接続も一般的になってきていますので、 これらを使って貧乏TV電話などをやってみるのも面白いでしょう。 帯域の問題があるため、工夫しないとうまくいきませんが、 「お金を使わないための苦労は厭わない」精神で頑張ってみてください。

注意

[1]

他のビデオデバイスは、ほとんど入手できないでしょう。

[2]

http://alpha.dyndns.org/ov511/

[3]

grep -i camera */pkg-commentなどとして 探してください。