この文章は NTP サーバの設定 EMONにより複数ホストを用いて映像と音声の同期再生 を行なう方法について説明します。 [注意] NTPについては、ほとんど何も知らない人向けの文章になっています。 そのため、用語が正しくありません。 0.説明する環境 以下のような環境においてNTPを用いて NTP Clientsの時計をNTP Serverの時計に同期させる方法を説明します。 | WAN -|-------------------- | LAN +--+--+--+-..... | | | | | | - Server,Clients OS:FreeBSD 4.3 - NTP ServerとNTP Clientsはそれぞれ別のサブネットでも可 1. NTP Server(10.0.0.1) 1.1 /etc/ntp.conf の設定 WAN にあるNTPサーバー(ntp.server)が利用できる場合 server ntp.server という1行の設定ファイルを用意して下さい。 NTP Serverの持っているクロックをNTPの時計とする場合は server 127.127.1.1 fudge 127.127.1.1 という設定ファイルを用意して下さい。 1.2 実行 WAN にあるNTPサーバーを用いる場合は、始めに # ntpdate -b ntp.server を実行し、時計を修正します。 そして # ntpd で、NTPのデーモンを起動し、 細かな時計のズレを補正して同期を維持します。 別のホストから % ntpq -p 10.0.0.1 とすると、 NTP Server の状態が表示されます。 remote refid st t when poll reach delay offset jitter ========================================================================== XXXXXXXX YYYYYYYY ? ? ? ?? ?? ?.??? ?.??? ?.??? というのが出力されれば、設定完了です。 2. NTP Client (ここでは 10.0.2.2とする) 2.1 /etc/ntp.conf の設定 server 10.0.0.1 minpoll 4 maxpoll 5 という1行の設定ファイルを用意します。 2.2 実行 まず始めに # ntpdate -b 10.0.0.1 を実行し、時計を修正します。 そして # ntpd で、NTPのデーモンを起動し、 細かな時計のズレを補正して同期を維持します。 % ntpq -p 10.0.2.2 とすると、 NTP Client の状態が表示されます。 remote refid st t when poll reach delay offset jitter ========================================================================== XXXXXXXX YYYYYYYY ? ? ? ?? ?? ?.??? ?.??? ?.??? というのが出力されれば、設定完了です。 3.EMON の実行ファイルを準備 emon20020331.tar.gz を探して頂いて、 展開し、コンパイルして下さい。 以下で、 映像キャプチャホスト:10.0.4.10 映像再生ホスト :10.0.4.11 音声キャプチャホスト:10.0.2.12 音声再生ホスト :10.0.2.13 として複数ホストで同期再生を行なう方法の例を説明します。 4つ全てのホストはすでに述べた方法で NTPの設定をし、ホストの時計の同期が保たれていなければなりません。 4.1 映像のキャプチャ(10.0.4.10) まず映像の取り込みの確認をします。 ディバイス/dev/bktr0のS端子から映像を取り込む時 % ./jpegcapt -lS |less あるいは % ./jpegcapt -lS |./jpegplay により、jpegcapt が映像をキャプチャーできているか確認します。 確認ができれば、/dev/bktr0のディバイスのS端子から映像を取り込む時 ./jpegcapt -lS |./fecenc |./rtpsend -A 10.0.4.11 -P10004 と実行し、10.0.4.11へ映像を送信します。 4.2 映像の再生(10.0.4.11) まず、映像が送られているか確認します。 % ./rtprecv -A10.0.4.11 -P10004 |less により、lessにデータが送られるか、すなわち、 10.0.4.10から映像データが送られているか確認します。 確認ができれば、 % ./rtprecv -A10.0.4.11 -P10004 | ./fecdec | ./jpegplay -d 1000 -W2000 を実行します。 -dが映像をキャプチャしてから再生するまでの時間(msec)を指定しています。 -Wは-dの2倍の値を与えて下さい。 4.3 音声のキャプチャ(10.0.2.12) まず、音声の取り込みの確認をします。 /dev/dsp から音声を取り込む時、 % ./audiocapt -C44100 -R100 -c1 -m1 -r44100|less あるいは % ./audiocapt -C44100 -R100 -c1 -m1 -r44100|./audioplay -C44100 -R100 -c1 -r44100 -m0 などを実行し、音声の録音ができているかを確認します。 [よくある問題] audiocapt のエラーはでないが、音声が聞こえない % mixer rec を実行し、録音の音量を確認して下さい。音量が0の時は % mixer rec 50 とすると、録音の音量が50になります。 もし、 % mixer line 50 としても、lineからの録音音量は50に変化しません。 つまり、全く無意味です。 % mixer recsrc を実行すると、どの入力を録音するかを確認できます。 入力の一覧は % mixer -h で表示されます。入力を line にする時は、 % mixer '=rec' line あるいは % mixer \=rec line と実行して下さい。 では、録音ができるようになったと期待しまして、 音声を送信する方法を述べます。 % ./audiocapt -C44100 -R100 -c1 -m1 -r44100|./rtpsend -A10.0.2.13 -P10002 と実行して下さい。 audiocaptの-m1 は"おまじない"です。 4.4 音声の再生(10.0.2.13) 映像の再生と同様に % ./rtprecv -A10.0.2.13 -P10002 |less により、10.0.2.12から音声データが送られているか確認します。 確認ができれば、 % ./rtprecv -A10.0.2.13 -P10002 |./audioplay -C44100 -R100 -c1 -r44100 -m0 -t1000 と実行して再生します。audioplay の -m0 は"おまじない"です。 audioplay の -tは、キャプチャから再生までの時間(msec)となっていますので、 jpegplay の -d と同じ値を指定して下さい。 [注意] ここでは、音声データのフォーマットを 44.1KHz1chLinear16bit としましたが、これ以外でも動作します。 ただし、 2chだと録音できない場合が多いので、1chでうまくいってから試す方が安全 8KHzだと、(dsp中のバッファサイズを小さくできない問題を持つdspを用ると、) 44.1KHzの場合に比べて約5倍の同期精度の悪化を生じる。 実際、この精度の悪化は"普通の人間"が同期していないと 感じさせるだけの影響がある ということを考えて44.1KHz1chLinear16bitの例を説明しました。 --- 笠松 健一