Wyse3040+FreeBSD+Logicool Webcamで監視カメラを自作する
Creating CCTV with Wyse3040 + FreeBSD + Webcam
はじめに
Wyse3040を自宅で遊ばせていたので、そろそろなにかしたいなと思っていたところ、余っていたWebカメラをみつけたので、即席の監視カメラを作成してみました。
実行環境
機器名:Wyse3040
OS:FreeBSD 14.3
Logicool Webcam C270
※画像の一番右は外付けHDDとなっていて、ここからFreeBSDを起動しています

パッケージのインストール
Logicool WebcamをFreeBSDで認識できるように、webcamdをインストールしていきます。
webcamdはcuseカーネルモジュールをロードする必要があるので、まずそれを行っていきます。
# 手動の場合
kldload cuse
# 自動でロードする場合
tail /boot/loader.conf
cuse_load="YES"
次にwebcamdをインストールしていきます。
pkg install webcamd
今後、自動でwebcamdを有効にしたい場合はrc.confにwebcamd_enable=”YES”と追加します。
cat /etc/rc.conf
.
.
.
webcamd_enable="YES"
手動で毎回webcamdを有効にしたい場合は以下のコマンドで行うことが可能です。
# 起動
service webcamd onestart
# 停止
service webcamd onestop
# 状態確認
service webcamd status
webcamdが稼働していると、USBデバイスのカメラが/dev/video0という形で認識・操作が可能になります。USBデバイスで無事に認識されたか確認するためのコマンドを載せておきますので、うまくいかない時などに参考にしてください。
usbconfig
ugen0.2: <Webcam C270 Logitech, Inc.> at usbus0, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON (500mA)
# もしくはdmesgでシステムログを確認する
dmesg
写真の撮影
/dev/video0と認識しているので、そこを指定してコマンドを実行していきます。今回はfswebcamとffmpegを使って写真を撮影しました。
pkg install fswebcam
fswebcam -d /dev/video0 -r 640x480 photo.jpg
# バナーなし
fswebcam -d /dev/video0 -r 640x480 --no-banner photo.jpg
# ffmpeg
ffmpeg -f v4l2 -i /dev/video0 -frames:v 1 photo.
実際にlogicoolのC270で撮れた写真が以下のものです。
fswebcamで撮影

ffmpegで撮影

動画の撮影
同じように動画の撮影を行っていきます。今回はffmpeg、vlcを使って行いました。
# 基本(Ctrl+Cで停止)
ffmpeg -f v4l2 -video_size 640x480 -i /dev/video0 video.mp4
# 時間指定(10秒)
ffmpeg -f v4l2 -video_size 640x480 -i /dev/video0 -t 10 video.mp4
# 音声も録音
ffmpeg -f v4l2 -i /dev/video0 -f oss -i /dev/dsp0 \
-c:v libx264 -c:a aac video.mp4
実際に撮影したものがこちらです。
vlcを使って行うことも可能です。
pkg install vlc
# GUI起動
vlc v4l2:///dev/video0
# コマンドライン録画
cvlc v4l2:///dev/video0 --sout file/mp4:video.mp4
HTTPストリーミング
次にHTTPストリーミングを行っていきます。今回はmotionを使いました。
$ pkg install motion
$ vim motion.conf
daemon off
videodevice /dev/video0
v4l2_palette 0
emulate_motion off
# movie_filename webcam # ファイル名を指定したい場合
# movie_max_time 3600 # デフォルト120、0だと無制限
movie_codec mp4
width 640
height 480
framerate 15
stream_port 8081
stream_localhost off
stream_maxrate 15
output_pictures off
$ motion -c motion.conf
motion稼働後、http://IPアドレス:8081にアクセスをしてもらうと、以下のようにストリーミングされている様子がわかると思います。

実際にストリーミングしたものはこちらです。
motionはデフォルトで動きが検知されなくなってから一定時間経過すると録画を停止するようになっていますので、もし常時録画などにしたい場合はemulate_motionをonに変更してください
emulate_motion on
その他設定はmotionのmanページを参考にしてくださいませ
https://man.freebsd.org/cgi/man.cgi?query=motion&sektion=1&manpath=freebsd-ports
カメラ明るさ調整・その他設定など
カメラの明るさ調整・その他設定を変更したい場合はv4l-utilを使用します。
$ pkg install v4l-utils
# 利用可能な設定を確認
$ v4l2-ctl -d /dev/video0 --list-ctrls
# フォーマット確認
$ v4l2-ctl -d /dev/video0 --list-format-ext
# 全設定表示
$ v4l2-ctl -d /dev/video0 --all
出力例:
brightness 0x00980900 (int) : min=0 max=255 step=1 default=128 value=128
contrast 0x00980901 (int) : min=0 max=255 step=1 default=32 value=32
saturation 0x00980902 (int) : min=0 max=255 step=1 default=32 value=32
white_balance_temperature_auto 0x0098090c (bool) : default=1 value=1
gain 0x00980913 (int) : min=0 max=255 step=1 default=0 value=0
power_line_frequency 0x00980918 (menu) : min=0 max=2 default=2 value=2
white_balance_temperature 0x0098091a (int) : min=2000 max=6500 step=1 default=4000 value=4000 flags=inactive
sharpness 0x0098091b (int) : min=0 max=255 step=1 default=22 value=22
backlight_compensation 0x0098091c (int) : min=0 max=1 step=1 default=1 value=1
exposure_auto 0x009a0901 (menu) : min=0 max=3 default=3 value=3
exposure_absolute 0x009a0902 (int) : min=3 max=2047 step=1 default=250 value=250 flags=inactive
以下、コマンド例を載せておきます。
# 明るさUP
v4l2-ctl -d /dev/video0 --set-ctrl=brightness=200
# ゲイン(感度)UP
v4l2-ctl -d /dev/video0 --set-ctrl=gain=200
# 露出を手動にして長めに
v4l2-ctl -d /dev/video0 --set-ctrl=exposure_auto=1
v4l2-ctl -d /dev/video0 --set-ctrl=exposure_absolute=500
# コントラスト
v4l2-ctl -d /dev/video0 --set-ctrl=contrast=50
まとめ
以上、監視カメラの作成方法についてでした。Wyse3040とLogicoolのWebカメラだけだと大体7W前後の消費電力になりました。外付けHDD込みでも10W前後というところですね。
1時間稼働させたものを確認しましたが、安定して動作しているみたいです。
$ top
.
.
CPU: 9.1% user, 0.0% nice, 0.2% system, 0.8% interrupt, 89.9% idle
Mem: 97M Active, 572M Inact, 788K Laundry, 743M Wired, 56K Buf, 451M Free
ARC: 432M Total, 152M MFU, 268M MRU, 768K Anon, 1763K Header, 9182K Other
384M Compressed, 578M Uncompressed, 1.51:1 Ratio
Swap: 2048M Total, 2048M Free
.
.
PID USERNAME THR PRI NICE SIZE RES STATE C TIME WCPU COMMAND
9789 hoge 11 20 0 185M 51M nanslp 3 60:17 38.10% motion
976 root 14 -44 r8 65M 20M cuse-s 1 60:49 1.19% webcamd
9809 hoge 1 20 0 15M 3632K CPU1 1 0:00 0.13% top
おわりに
Wyse3040は中古で3000円弱とRaspberry piよりも安価に手に入ります。Logicool Webcamのこの型番もAmazonで2000円弱で買うことが可能です。色々遊べますので是非皆さんもやってみてください。
参考
webcamdのmanページ:https://man.freebsd.org/cgi/man.cgi?query=webcamd&sektion=8&n=1
motionのmanページ:https://man.freebsd.org/cgi/man.cgi?query=motion&sektion=1&manpath=freebsd-ports
v4l2のmanページ:https://man.freebsd.org/cgi/man.cgi?query=v4l2-ctl&apropos=0&sektion=1