電源の関係で、新調したサーバ群を自室ではなく居間に設置した。セットアップを済ませた新サーバに近づく用事といえば、たまに DVD を焼くくらいしかない。それも自分の為ではなく、大抵が他人の為にだ。
一人暮らしには広い一軒家の二階に住んでいる所為で、居間は客人を向かえ入れて雑談したり、食事をしたり、泊めたりする場と化していた。部屋には、小型熱帯魚水槽( 120cm スリム )、金魚水槽( 45cm )、アロワナ水槽( 60cm )の 3 つの水槽を置いている。水槽の間近にサーバやケーブルを設置するのは、MTBF を鬼のように下げているのかもしれないが、そもそもの話、このくたびれた築100年の木造住宅に設置する限り、そんな事はもはや歯牙に懸けない。
サーバの隣に水槽があるのだから、と、水槽の状況をライブ配信してみようと思った。泊まりに出た時、外からでも水槽の状況を把握出来るのは良い。アマゾンで 699 円の安い USB Web カメラを見つけたので、試しに購入。上海問屋の DN-DC1303 という製品で、幸いにも UVC に対応していた。値段が値段なので期待していなかったが、筐体ががっちりとした金属で、LED 照明を 4 基実装していた。さらに、USB ケーブルの途中にあるダイアルで、照度を無段階調整出来る。
さらに、差すとあっさりと uvcvideo デバイスとして認識してくれた。
$ dmesg [ 6.857407] Linux video capture interface: v2.00 [ 6.924282] uvcvideo: Found UVC 1.00 device USB2.0_Camera (093a:2700) [ 6.981831] input: USB2.0_Camera as /class/input/input0 [ 6.981831] usbcore: registered new interface driver uvcvideo [ 6.981831] USB Video Class driver (v0.1.0)
チップを調べて、ノンブランドというあるか無いか分からないようなドライバを探し出し、コンパイルオプションに戸惑いながらビルドする覚悟だったので、本当に拍子抜け。
Web カメラを操作するツールやアプリケーションを探してみると、
- motion
- luvcview
- uvccapture
- webcamd
というものがあった。
全てインストールしてみたが、motion は「 Memory Map にデバイスが対応してないよ ! 」との事で動いちゃくれなかった。別に動体検知は要らないし、ffmpeg に噛ましてストリーミング配信するつもりもなかったので、motion は必要に駆られた時に使おう。そう思ったまま、motion デーモンが起動しっぱなしで、その他 3 つのコマンドを試す間、/dev/video0 デバイスを握りっぱなしだった。もちろん、その他 3 つのコマンドではデバイスが開けない、とエラーが出る。
一番使い勝手が良さそうな uvccapture を試していたのだが、エラーメッセージが
/dev/video0: No such or directory
だったので、結構騙された。うわーこれ、Device is busy って事か。
dmesg しても lsmod しても、ちゃんと vncvideo デバイスとして認識されている。しかし、motion は動いてくれなかった。ぐぐって見た記事によると、UVC 対応製品でも動かない例があるようだ。さらにコイツは安物…。加えて、V4L2 エラーとか吐きはじめているぞ。そういや、調べている記事は、どれも X が載っている事前提だ。あれえ?
そんな事ばかりに気を取られていたので、motion が起動中だった事を 1 時間近く忘れたまま、四苦八苦していた。エラーが出て終了してると思いきや、ちゃっかり lsof | grep video0 にヒットしやがった。motion デーモンを停止すると、ちゃんと uvccapture で正常に撮影する事が出来た。
以下、uvccapture のコマンドラインオプションの意訳。
uvccapture version 0.4 Usage is: uvccapture [options] Options: -v 冗長な表示を行う -o<filename> 出力ファイル名 (デフォルト: snap.jpg) -d<device> V4L2 デバイス (デフォルト: /dev/video0) -x<width> 画像の幅 (デバイスにサポートされている事!)(>960 activates YUYV capture) -y<height> 画像の高さ (デバイスにサポートされている事!)(>720 activates YUYV capture) -c<command> 撮影後、実行するコマンド -t<integer> 指定秒数間隔で繰返し撮影する (0=一回だけ撮影) -q<percentage> JPEGの画質/圧縮レベル (activates YUYV capture) -r mmap の代わりに read を使う -w コマンド終了後から、次の撮影までの待ち時間 -m YUYV キャプチャモードをトグル Camera Settings: -B<integer> 輝度 -C<integer> コントラスト -S<integer> 彩度 -G<integer> ゲイン
手前の環境では、以下のようにした。
# 1秒ごとに webcam.jpg というファイル名で撮影した画像を出力。 $ uvccapture -m -d/dev/video0 -t1 -o./ram/webcam.jpg 2>/dev/null &
ちゃんと撮影出来ているのにも関わらず、撮影の度に ioctrl でエラーを吐いていたので、エラーメッセージを null に捨てバックグラウンドジョブとする。また、SSD とは言え頻繁にディスクアクセスが発生する為、出力先ディレクトリを tmpfs (RAM ディスク)にしておいた。
さらに、ウェブブラウザ経由から撮影画像を見る為に、以下のような HTML を用意。
<META HTTP-EQUIV=Pragma CONTENT=no-cache> <META HTTP-EQUIV=Refresh CONTENT=2> <table background="./ram/webcam.jpg" border=0 cellspacing=0 cellpadding=0> <img src=./ram/webcam.jpg> </table>
これは、webmond にあったテンプレートを拝借し、カスタマイズしたもの。Firefox で画像を切り替える際のちらつきを無くす為、TABLE の BACKGROUND にも撮影画像を指定した。
以下は実際に撮影した画像。安物にしては良く撮れている方だと思う。
これは金魚水槽だが、帰宅したら小型熱帯魚水槽方向に向け、明るさやピントを調整しようと思う。
※ 2020/07/02 度重なるブログ移転・ブログシステムのアップデートにより崩れた記事を校正。
[…] 前回の記事で、UVC 対応の安物 USB カメラを使った撮影画像の配信を行なったが、今度は動画としてストリーミング配信を行う事にした。 […]