これはなに?
私は写真を取るのが好きです。でも、PCを立ち上げ、ログインして、コマンドを叩くなど行い、
写真をPCに取り込むのがめんどくさいです。紆余曲折、やっと簡単に取り込めるようになったので、ご紹介します。
想定する利用方法
- 写真をとる
- カメラを操作し、お家LAN(無線LAN インフラストラクチャーモード)につなぐ。IPアドレスはカメラ固定であること。
- PC上の常駐PGが、IPアドレスにつながったことを検知し、自動でgphoto2の機能を使って写真をPCに移動する。
- カメラの電源を切る。(もしくは勝手に電源が切れる)
つまり、PCに触ることなく、カメラの操作だけで、カメラ内の画像がPCに移動されます。
面倒なSDカードの抜き差しや、カメラメーカのツールを起動なしで、PCに取り込みができます。
これさえできれば、あとはイントラネット内でWEBで鑑賞など色々応用ができますね!
準備するもの
- gphoto2 に関するライブラリ類
- ffi-gphoto2
- ruby
バージョン等は下の通り。
webalbum@intra:~/work/autoTransFromCamera$ uname -a
Linux intra 4.9.35-v7+ #1014 SMP Fri Jun 30 14:47:43 BST 2017 armv7l GNU/Linux
webalbum@intra:~/work/autoTransFromCamera$ ruby -v
ruby 2.4.1p111 (2017-03-22 revision 58053) [armv7l-linux-eabihf]
webalbum@intra:~/work/autoTransFromCamera$ gem list |grep ffi
ffi (1.15.4)
ffi-gphoto2 (0.9.0)
webalbum@intra:~/work/autoTransFromCamera$ gphoto2 -v
gphoto2 2.5.11
Copyright (c) 2000-2016 Lutz Mueller and others
…<中略>…
photo2 2.5.11 gcc, popt(m), exif, cdk, aa, jpeg, readline
libgphoto2 2.5.12 all camlibs, gcc, ltdl, EXIF
libgphoto2_port 0.12.0 gcc, ltdl, USB, serial without locking
webalbum@intra:~/work/autoTransFromCamera$
あとはこれ
ここに記載している通り、カメラ内の画像を移動させます。つまりカメラ内の画像を削除する
ことを意味しており、何らかの不具合で大切な写真が削除されることも否定できません。
そのため、自己責任 でお願いします。
なお、動作確認が取れたカメラは、EOSR,EOS 7DMarkII,PowerShotSX730HSですが、gphoto2が対応している
カメラなら同じかと思います。
備忘
gphoto2でハマった点 wifiでの接続の仕方
wifiでの接続方法がわかりませんでした。コマンドラインと同じくportにptpipと設定したのですが、
駄目で何かしらカメラのモデルを設定しないと動きませんでした。(なぜ)
camera_model='Canon EOS 7D MarkII'
<中略>
camera = GPhoto2::Camera.new(camera_model,"ptpip:#{camera_ip_addres}")
理由はわかりませんが、カメラモデルに、EOSRを設定したところ、エラーになりました。
しかし、7DMarkIIを指定したら何故か動きました。(なぜ?)
対応カメラは、libgphoto2のバージョンによりますが、下の通りです。
gphoto2でハマった点 カメラが見えない。
当初コマンドラインから操作しようと思いました。ですが、一回コマンドを発行すると
カメラ側のIPアドレスにpingを打っても応答がなくなり、約10秒後に復活するようでした。
そのため、コマンドラインでは無理と思い、rubyのPGをより操作することを検討しました。
トランザクション
いつも悩むのがトランザクション?の単位です。
全量のファイルをカメラからPCのへコピーし、その後、カメラ内のファイルを消す方法が考えられますが、
慎重に行いたいため、1ファイルのコピーし、コピー先のファイルサイズが同じことを確認し、
カメラ内のファイルを削除しています。
ハマった点 Out of memory
カメラ内の大量の写真があったとき。。。
[13868762.678745] Normal: 113*4kB (MEC) 286*8kB (UMEC) 504*16kB (UMEC) 112*32kB (UMEC) 29*64kB (UMEC) 1*128kB (M) 0*
256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 16372kB
[13868762.678780] 4072 total pagecache pages
[13868762.678784] 248 pages in swap cache
[13868762.678789] Swap cache stats: add 17143743, delete 17143495, find 584280078/589530693
[13868762.678790] Free swap = 0kB
[13868762.678793] Total swap = 1048572kB
[13868762.678795] 241664 pages RAM
[13868762.678797] 0 pages HighMem/MovableOnly
[13868762.678799] 5286 pages reserved
[13868762.678801] 2048 pages cma reserved
[13868762.678803] [ pid ] uid tgid total_vm rss nr_ptes nr_pmds swapents oom_score_adj name
<中略>
[13868762.679616] Out of memory: Kill process 19132 (ruby) score 456 or sacrifice child
[13868762.679632] Killed process 19132 (ruby) total-vm:967264kB, anon-rss:691336kB, file-rss:0kB, shmem-rss:0kB
とのことです。
色々考えたのですが、最大100ファイルとして、そこで強制的にruby のPGを終了させ、次の処理で持ち越すようにしました。