2020/06/22(月) [n年前の日記]
#1 [pc] コンパクトデジカメをgphoto2を使ってWebカメラ化できるか実験
Linux + gphoto2 を使えば、一部のコンデジ(コンパクトデジカメ)をリモート操作できたりするのだけど、関連情報をググっていたらWebカメラ化することもできなくもない、という話を見かけたので試してみたり。
環境は以下。
gphoto2 からリモート操作できるデジカメの一覧は以下。
_gPhoto - Doc :: Remote controlling cameras
ページの最後のあたりに、「2009年以降のCanon製コンデジはリモート操作できないよ」「Sony製やFuji製も全滅だよ」と書いてある。 *1
保存先を変更すれば、メモリカードに残せるのかもしれない。
ただ、mjpg動画の再生方法が分からない…。ffmpge でmp4動画に変換する。
環境は以下。
- OS : VMware Player + Ubuntu Linux 20.04 LTS。ホストOSは Windows10 x64 1909。
- Camera : Canon PowerShot A300。300万画素。単三乾電池を使用する製品。
gphoto2 からリモート操作できるデジカメの一覧は以下。
_gPhoto - Doc :: Remote controlling cameras
ページの最後のあたりに、「2009年以降のCanon製コンデジはリモート操作できないよ」「Sony製やFuji製も全滅だよ」と書いてある。 *1
◎ 必要なパッケージのインストール。 :
Ubuntu Linux 20.04 LTS上で作業。
sudo apt install gphoto2 v4l2loopback-utils
◎ 接続されてるデジタルカメラの一覧を表示。 :
gphoto2 --auto-detect
◎ デジタルカメラの情報を表示。 :
gphoto2 -a or gphoto2 --abilities
◎ Canon製デジタルカメラを撮影可能状態にする。 :
Canon製デジカメはコレをしないと撮影可能な状態にならない。
gphoto2 --set-config capture=on
◎ フラッシュを無効化。 :
gphoto2 --set-config flashmode=0
◎ 画像を撮影してPC側にダウンロード。 :
メモリカード内の画像は消える。
gphoto2 --capture-image-and-download
◎ 画像を撮影してデジカメのRAM内にのみ残す。 :
gphoto2 --capture-image
保存先を変更すれば、メモリカードに残せるのかもしれない。
gphoto2 --get-config capturetarget gphoto2 --set-config capturetarget=1
◎ プレビュー画像をPCに保存。 :
gphoto2 --capture-preview
◎ 動画をPCに保存。 :
gphoto2 --capture-movie=10s gphoto2 --capture-movie=0
- --capture-movie=10s なら10秒保存。
- --capture-movie=0 なら (0+1)フレーム保存
ただ、mjpg動画の再生方法が分からない…。ffmpge でmp4動画に変換する。
ffmpeg -i movie.mjpg -vcodec libx264 -pix_fmt yuv420p movie.mp4
◎ /dev/video* を用意する。 :
キャプチャデバイスとして扱われる /dev/video* を用意する。
現在の状態を確認。
モジュールを有効化。
キャプチャデバイスが増えたか確認。
解説記事等では、/dev/video1 等が増えると記述されてるけれど、VMware Player + Ubuntu 20.04 LTS の環境では、/dev/video0 が追加された。この /dev/video0 に動画を流し込んでやれば、キャプチャデバイスとして扱われるらしい。
現在の状態を確認。
ls /dev/video*
モジュールを有効化。
sudo modprobe v4l2loopback exclusive_caps=1 card_label="GPhoto2 Webcam" or sudo modprobe v4l2loopback exclusive_caps=1 or sudo modprobe v4l2loopback
キャプチャデバイスが増えたか確認。
lsmod ls /dev/video*
解説記事等では、/dev/video1 等が増えると記述されてるけれど、VMware Player + Ubuntu 20.04 LTS の環境では、/dev/video0 が追加された。この /dev/video0 に動画を流し込んでやれば、キャプチャデバイスとして扱われるらしい。
◎ コンデジをWebカメラ化する :
コンパクトデジカメからmjpeg動画を取得して、ffmpeg で変換して /dev/video* に流し込むことで、Webカメラっぽいものに見せかける。
VLCを起動して、/dev/video0 を再生。
gphoto2 --stdout --capture-movie | ffmpeg -i - -vcodec rawvideo -pix_fmt yuv420p -threads 0 -f v4l2 /dev/video0
VLCを起動して、/dev/video0 を再生。
◎ Canon製デジタルカメラを撮影不可状態にする :
gphoto2 --set-config capture=off
◎ 参考ページ。 :
_コンピュータによるカメラのリモート制御を可能とするgPhoto | OSDN Magazine
_gPhoto - Doc :: Remote controlling cameras
_gPhoto - Projects :: libgphoto2 :: supported cameras
_Linuxでデスクトップを偽のWebカメラとして使用する
_v4l2loopbackで仮想videoデバイスを作る - unknownplace.org
_Using a digital camera ( Canon) as webcam - Ask Ubuntu
_gPhoto - Doc :: Remote controlling cameras
_gPhoto - Projects :: libgphoto2 :: supported cameras
_Linuxでデスクトップを偽のWebカメラとして使用する
_v4l2loopbackで仮想videoデバイスを作る - unknownplace.org
_Using a digital camera ( Canon) as webcam - Ask Ubuntu
◎ 感想。 :
一応、Webカメラっぽく使うことはできたけど、画質が酷過ぎる…。320x240という低解像度、更に mjpg(Motion JPEG)なので、そりゃまあこういう画質になりますわな、みたいな。VGA画質のトイデジカメをWebカメラとして利用するほうがまだマシかもと思えるほどの低画質。レンズ周りは、コンデジのほうがWebカメラやトイデジカメよりはるかにまともだろうと想像するのだけど、それでもここまで酷い画質になるとは予想外だった。
そもそも gphoto2 の動画取得は、プレビュー画像を連続取得して動画化、という仕組みだそうで。プレビュー画像と言うのは、おそらくデジカメの液晶画面に映っているソレだろうな…。そりゃ低画質になるわなと。
これがもし、デジカメ自体が持っている動画撮影モードを利用できれば、もうちょっとマシになるのかもしれない。例えば Canon PowerShot A300 の場合、640x480の解像度で動画撮影できるので、320x240 よりは改善するだろうと。ただ、その動画撮影モードを使うと、撮影終了直後にデジカメ上で結構処理時間がかかるので…。仮にそういった機能を利用できたとしても、gphoto2 がスイスイと画像取得するわけにもいかないのだろうと想像してみたり。
まあ、このあたり、高級な一眼レフデジカメを使えば満足できる画質が得られるのかも。そっちは違う仕組みで動画を取り出すっぽいし。
そもそも gphoto2 の動画取得は、プレビュー画像を連続取得して動画化、という仕組みだそうで。プレビュー画像と言うのは、おそらくデジカメの液晶画面に映っているソレだろうな…。そりゃ低画質になるわなと。
これがもし、デジカメ自体が持っている動画撮影モードを利用できれば、もうちょっとマシになるのかもしれない。例えば Canon PowerShot A300 の場合、640x480の解像度で動画撮影できるので、320x240 よりは改善するだろうと。ただ、その動画撮影モードを使うと、撮影終了直後にデジカメ上で結構処理時間がかかるので…。仮にそういった機能を利用できたとしても、gphoto2 がスイスイと画像取得するわけにもいかないのだろうと想像してみたり。
まあ、このあたり、高級な一眼レフデジカメを使えば満足できる画質が得られるのかも。そっちは違う仕組みで動画を取り出すっぽいし。
◎ 余談。 :
最初、gphoto2 --capture-preview や gphpto2 --capture-movie=10s をしても 0バイトのファイルしか出てこなくておかしいなと思ってたら、デジカメ側の電池が切れていた…。つまり、0バイトのファイルが出てきたら、デジカメ側の電源を疑ってみたほうがいいのかもしれない。
デジカメに、別の eneloop を入れたけど、静止画撮影はできるものの、動画撮影をすると数秒で「バッテリーを交換してください」と表示されてしまって。電圧を測ってみたら、1.2V。充電池の規格を満たす電圧ではあるけれど、これでは足りないということかな…。
今まで使ってた eneloop を再充電してテスターで電圧を測ってみたら、1.5Vぐらいあった。充電池も、充電直後なら、単三乾電池を要求するデジカメを動かせる電圧になってるのだな…。
デジカメに、別の eneloop を入れたけど、静止画撮影はできるものの、動画撮影をすると数秒で「バッテリーを交換してください」と表示されてしまって。電圧を測ってみたら、1.2V。充電池の規格を満たす電圧ではあるけれど、これでは足りないということかな…。
今まで使ってた eneloop を再充電してテスターで電圧を測ってみたら、1.5Vぐらいあった。充電池も、充電直後なら、単三乾電池を要求するデジカメを動かせる電圧になってるのだな…。
◎ ログも一応メモ。 :
gphoto2 --capture-movie で取得した .mjpg を ffmpeg で mp4 に変換した際のログをメモ。
途中で、「この入力動画って低画質過ぎるんだけど、もしかして俺っちってば自動判別を間違えてない?」と言われてるような気もする…。
途中で、「この入力動画って低画質過ぎるんだけど、もしかして俺っちってば自動判別を間違えてない?」と言われてるような気もする…。
$ ffmpeg -i movie.mjpg -vcodec libx264 -pix_fmt yuv420p movie.mp4 ffmpeg version 4.2.2-1ubuntu1 Copyright (c) 2000-2019 the FFmpeg developers built with gcc 9 (Ubuntu 9.3.0-3ubuntu1) configuration: --prefix=/usr --extra-version=1ubuntu1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-nvenc --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared libavutil 56. 31.100 / 56. 31.100 libavcodec 58. 54.100 / 58. 54.100 libavformat 58. 29.100 / 58. 29.100 libavdevice 58. 8.100 / 58. 8.100 libavfilter 7. 57.100 / 7. 57.100 libavresample 4. 0. 0 / 4. 0. 0 libswscale 5. 5.100 / 5. 5.100 libswresample 3. 5.100 / 3. 5.100 libpostproc 55. 5.100 / 55. 5.100 [mjpeg @ 0x55f10b197740] Format mjpeg detected only with low score of 25, misdetection possible! Input #0, mjpeg, from 'movie.mjpg': Duration: N/A, bitrate: N/A Stream #0:0: Video: mjpeg (Baseline), yuvj422p(pc, bt470bg/unknown/unknown), 320x240, 25 tbr, 1200k tbn, 25 tbc Stream mapping: Stream #0:0 -> #0:0 (mjpeg (native) -> h264 (libx264)) Press [q] to stop, [?] for help [swscaler @ 0x55f10b1e45c0] deprecated pixel format used, make sure you did set range correctly [libx264 @ 0x55f10b19e480] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2 [libx264 @ 0x55f10b19e480] profile High, level 1.3 [libx264 @ 0x55f10b19e480] 264 - core 155 r2917 0a84d98 - H.264/MPEG-4 AVC codec - Copyleft 2003-2018 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=4 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00 Output #0, mp4, to 'movie.mp4': Metadata: encoder : Lavf58.29.100 Stream #0:0: Video: h264 (libx264) (avc1 / 0x31637661), yuv420p, 320x240, q=-1--1, 25 fps, 12800 tbn, 25 tbc Metadata: encoder : Lavc58.54.100 libx264 Side data: cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1 frame= 552 fps=329 q=-1.0 Lsize= 1040kB time=00:00:21.96 bitrate= 387.8kbits/s speed=13.1x video:1032kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.705626% [libx264 @ 0x55f10b19e480] frame I:3 Avg QP:22.06 size: 8966 [libx264 @ 0x55f10b19e480] frame P:139 Avg QP:24.14 size: 4437 [libx264 @ 0x55f10b19e480] frame B:410 Avg QP:28.43 size: 1007 [libx264 @ 0x55f10b19e480] consecutive B-frames: 0.9% 0.0% 0.5% 98.6% [libx264 @ 0x55f10b19e480] mb I I16..4: 0.2% 99.8% 0.0% [libx264 @ 0x55f10b19e480] mb P I16..4: 0.3% 23.5% 0.3% P16..4: 24.7% 24.3% 24.9% 0.0% 0.0% skip: 2.0% [libx264 @ 0x55f10b19e480] mb B I16..4: 0.2% 3.1% 0.0% B16..8: 26.9% 10.8% 3.0% direct: 5.8% skip:50.3% L0:46.9% L1:32.8% BI:20.3% [libx264 @ 0x55f10b19e480] 8x8 transform intra:96.9% inter:91.8% [libx264 @ 0x55f10b19e480] coded y,uvDC,uvAC intra: 90.4% 86.6% 25.4% inter: 31.2% 32.5% 3.5% [libx264 @ 0x55f10b19e480] i16 v,h,dc,p: 18% 27% 11% 45% [libx264 @ 0x55f10b19e480] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 20% 23% 39% 2% 3% 2% 4% 4% 5% [libx264 @ 0x55f10b19e480] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 15% 15% 17% 8% 7% 8% 9% 9% 11% [libx264 @ 0x55f10b19e480] i8c dc,h,v,p: 57% 18% 24% 2% [libx264 @ 0x55f10b19e480] Weighted P-Frames: Y:0.0% UV:0.0% [libx264 @ 0x55f10b19e480] ref P L0: 34.8% 9.1% 35.6% 20.6% [libx264 @ 0x55f10b19e480] ref B L0: 62.4% 27.4% 10.2% [libx264 @ 0x55f10b19e480] ref B L1: 87.0% 13.0% [libx264 @ 0x55f10b19e480] kb/s:382.75
*1: そうやって高級機とコンデジの差別化をしていったのだろうけど、結果、スマホのカメラに駆逐されてコンデジ市場壊滅という展開になったあたりがなんと申しましょうか。
[ ツッコむ ]
以上です。