前回v4l1を用いたプログラムが動作しなかったので、今回はv4l2に対応しているfswebcamをインストールしてみた。
hirotaka-hachiya.hatenablog.com
まず、WebカメラELECOM UCAM-DLA200HSVをUSBポートに挿して、認識されたかどうかを以下のように確認する。
> lsusb Bus 001 Device 009: ID 056e:700a Elecom Co., Ltd Bus 001 Device 006: ID 046d:c534 Logitech, Inc. Unifying Receiver > ls /dev/video* /dev/video0 > lsmod | grep v4l v4l2_common 3777 2 pwc,videobuf2_core videodev 121307 3 pwc,v4l2_common,videobuf2_core
問題なく認識されているようなので、fswebcamをインストールして実行する。
> sudo apt-get install fswebcam > fswebcam --no-banner image.jpg --- Opening /dev/video0... Trying source module v4l2... /dev/video0 opened. No input was specified, using the first. Adjusting resolution from 384x288 to 352x288. --- Capturing frame... Captured frame in 0.00 seconds. --- Processing captured image... Disabling banner. Writing JPEG image to 'image.jpg'.
ここでは、fswebcamを実行してキャプチャした画像を、image.jpgに出力している。このファイルを表示してみると以下のようになった。色合いが変だが一応キャプチャできている。
> display image.jpg
ところで、fswebcamのソースコードは、Githubにて公開されているが、v4l1とv4l2ではだいぶコードの中身が違うようだ。前回エラーが出ていた以下のVIDIOCGCAPはv4l2では使われていないのがわかる。
https://github.com/fsphil/fswebcam
v4l1:
https://github.com/fsphil/fswebcam/blob/master/src_v4l1.c
if(ioctl(fd, VIDIOCGCAP, vd) < 0) { ERROR("%s: Not a V4L device?", src->source); ERROR("VIDIOCGCAP: %s", strerror(errno)); return(-1); }
v4l2:
https://github.com/fsphil/fswebcam/blob/master/src_v4l2.c
if(ioctl(s->fd, VIDIOC_QUERYCAP, &s->cap) < 0) { ERROR("%s: Not a V4L2 device?", src->source); return(-1); }