mieki256's diary



2020/06/22(月) [n年前の日記]

#1 [pc] コンパクトデジカメをgphoto2を使ってWebカメラ化できるか実験

Linux + gphoto2 を使えば、一部のコンデジ(コンパクトデジカメ)をリモート操作できたりするのだけど、関連情報をググっていたらWebカメラ化することもできなくもない、という話を見かけたので試してみたり。

環境は以下。
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)フレーム保存
320x240, 25FPSのmjpeg動画が得られた。

ただ、mjpg動画の再生方法が分からない…。ffmpge でmp4動画に変換する。
ffmpeg -i movie.mjpg -vcodec libx264 -pix_fmt yuv420p movie.mp4

/dev/video* を用意する。 :

キャプチャデバイスとして扱われる /dev/video* を用意する。

現在の状態を確認。
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カメラっぽいものに見せかける。
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

参考ページ。 :

感想。 :

一応、Webカメラっぽく使うことはできたけど、画質が酷過ぎる…。320x240という低解像度、更に mjpg(Motion JPEG)なので、そりゃまあこういう画質になりますわな、みたいな。VGA画質のトイデジカメをWebカメラとして利用するほうがまだマシかもと思えるほどの低画質。レンズ周りは、コンデジのほうがWebカメラやトイデジカメよりはるかにまともだろうと想像するのだけど、それでもここまで酷い画質になるとは予想外だった。

そもそも gphoto2 の動画取得は、プレビュー画像を連続取得して動画化、という仕組みだそうで。プレビュー画像と言うのは、おそらくデジカメの液晶画面に映っているソレだろうな…。そりゃ低画質になるわなと。

これがもし、デジカメ自体が持っている動画撮影モードを利用できれば、もうちょっとマシになるのかもしれない。例えば Canon PowerShot A300 の場合、640x480の解像度で動画撮影できるので、320x240 よりは改善するだろうと。ただ、その動画撮影モードを使うと、撮影終了直後にデジカメ上で結構処理時間がかかるので…。仮にそういった機能を利用できたとしても、gphoto2 がスイスイと画像取得するわけにもいかないのだろうと想像してみたり。

まあ、このあたり、高級な一眼レフデジカメを使えば満足できる画質が得られるのかも。そっちは違う仕組みで動画を取り出すっぽいし。

余談。 :

最初、gphoto2 --capture-preview や gphpto2 --capture-movie=10s をしても 0バイトのファイルしか出てこなくておかしいなと思ってたら、デジカメ側の電池が切れていた…。つまり、0バイトのファイルが出てきたら、デジカメ側の電源を疑ってみたほうがいいのかもしれない。

デジカメに、別の 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: そうやって高級機とコンデジの差別化をしていったのだろうけど、結果、スマホのカメラに駆逐されてコンデジ市場壊滅という展開になったあたりがなんと申しましょうか。

以上です。

過去ログ表示

Prev - 2020/06 - Next
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project