Sony Camera Remote APIがめっちゃ使いやすくなるラッパーライブラリ作りました


ずいぶん間が空いてしまいましたが、[こちらの記事](http://qiita.com/kota65535/items/a9afbeb28afd2c2ec0bb)の続きです。

Sony製カメラには[Camera Remote API]() というのがあって、Wi-Fi接続したカメラに対してHTTPで撮影・コンテンツ取得などの遠隔操作を行うことが可能です。ただしライブラリの類は一切提供されていない為あらゆるシーケンスを自分で書く必要があり、これが利用する上で大きなハードルとなっていました（SDK無しでAmazon AWSを扱うようなもんですね）。

そのような状況なので、アプリケーション開発者がもっとお手軽にカメラ機能を活用できるようSony Camera Remote APIの**ラッパーライブラリ**を作成しました。**[こちら](https://github.com/kota65535/sony_camera_remote_api)**のレポジトリで公開しています。言語はRubyで、`sony_camera_remote_api`という名前のRuby gemとして利用可能です。

## 特徴

* カメラとのWi-Fi接続をプログラム内から実行できる
* 撮影・コンテンツの取得がめっちゃ楽
* ライブビューの取得がめっちゃ楽
* カメラの設定変更がめっちゃ楽
* Wi-Fi接続が切れたら自動で再接続
* CLIがついてくる(Raspbery Piの`raspistill`みたいな感じ)


## インストール

他のgemと同様です。Bundlerを利用している場合はGemfileに下記のように記述し、`bundle install`を実行します。

```ruby
gem 'sony_camera_remote_api'
```

もしくは下記のようにグローバルにインストールします。

```bash
$ gem install sony_camera_remote_api
```

## 使い方

ユーザーが利用するクラスは`Camera`クラスと`Shelf`クラスの２つだけです。

| クラス | 機能                                                                                                |
|--------|-----------------------------------------------------------------------------------------------------|
| Camera | メインであるカメラ機能を提供するクラス                                                |
| Shelf  | カメラのWi-Fi設定の管理と接続機能を提供するクラス。Wi-Fi接続機能は**Linux**と**Mac OS X**のみ利用可能 |

`Shelf`クラスの接続機能は内部で自作の[これ](http://qiita.com/kota65535/items/9210727d807a31054842)とか[あれ](http://qiita.com/kota65535/items/4cd13ac28de51648e370)といったシェルスクリプトを呼んでいるだけなので、環境によっては動かないかも知れません…（Ubuntu 14.04とOS X Yosemiteでは確認済みです）。

使い方の大まかな流れはこんな感じです。

1. `SonyCameraRemoteAPI::Shelf`インスタンスを生成。引数はWi-Fi設定を保存するファイルのパスです。デフォルトでは`~/.sonycam.shelf`が設定ファイルとして使用されます。
2. 初回は設定が無いので、カメラのWi-Fi設定を`Shelf#add_and_select`で新規追加します。Wi-Fi接続は`Shelf#connect`で実行します。
3.  `SonyCameraRemoteAPI::Camera`インスタンスを生成。この時引数に`Shelf`インスタンスを与えるとSSDPの結果を保存してくれるので、 次回からインスタンス生成が早くなります。
4.  あとはお好きに！

下記のサンプルは静止画一枚を撮影し、即座にPCに転送するプログラムです。

```ruby
require 'sony_camera_remote_api'

# お手持ちのカメラのWi-Fi設定
ssid = "DIRECT-xxxx:ILCE-QX1"   # SSID
pass = "xxxxxxxx"               # Passphrase
interface = "wlan0"             # 接続に使うインターフェース名

# (1) Shelfインスタンスを生成
shelf = SonyCameraRemoteAPI::Shelf.new ".sonycam.shelf"
# (2) カメラ設定を追加し、接続
shelf.add_and_select ssid, pass, interface
shelf.connect

# (3) Cameraインスタンスを生成
cam = SonyCameraRemoteAPI::Camera.new shelf
# 静止画（一枚）撮影モードに変更
cam.change_function_to_shoot 'still', 'Single'
# 撮影＆画像転送。返り値は保存した画像ファイルの相対パス
filename = cam.capture_still
puts filename            #=> 'DSC_xxxxx.JPG'
```

### ドキュメント＆チュートリアル

各クラス・メソッドの詳細が知りたい方は、**[こちら](http://www.rubydoc.info/github/kota65535/sony_camera_remote_api)**のAPIドキュメントをご参照ください。`Camera`クラスには全部で23個のラッパーメソッドがあり、それぞれの使用例も載っています。

また、レポジトリの**[Wikiページ](https://github.com/kota65535/sony_camera_remote_api/wiki)**から、本ライブラリの詳細なチュートリアル（英語）を利用できます。先頭から読んでいただくのが一番ですが、カメラ機能ごとに章を分けているので、興味のある機能だけ見ることも可能です。例えば**[ライブビューの章](https://github.com/kota65535/sony_camera_remote_api/wiki/Streaming%20Live%20View)**では、毎フレームのライブビュー画像を保存するサンプルなどを載せています。下記を実行すると、`1.jpg, 2.jpg ...`といった連番の画像がPCに次々と保存されていきます。

```ruby
# ライブビュースレッドを起動
th = cam.start_liveview_thread do |img|
  # このブロックは毎フレームごとに呼び出され、画像をブロックパラメータから取得できる
  filename = "#{img.sequence_number}.jpg"
  # 画像を保存
  File.write filename, img.jpeg_data
  puts "wrote #{filename}."
end
th.join
```


## Sony Camera Remote CLI

これは本ライブラリのインストール時に付いてくる、サンプルプログラムも兼ねたCLIアプリケーションです。Raspberry Piのカメラモジュールのように、コマンドラインからカメラへの接続・撮影・コンテンツ取得が可能です。`sonycam`というコマンドで実行でき、下記のように撮影モードごとのサブコマンドを備えています。

|  サブコマンド  | 説明                |
|--------------|-----------------------------|
| `still`      | 静止画の単写（一枚）撮影  |
| `rapid`      | 静止画の連写撮影      |
| `intstill`   | 静止画のインターバル撮影 |
| `movie`      | 動画の撮影             |
| `looprec`    | 動画のループ撮影           |
| `contents`   | コンテンツ情報の取得・転送           |
| `shelf`      | カメラのWi-Fi接続設定の管理・接続先の選択   |

例えば、`sonycam still`と実行すると、下記のようにカメラへのWi-Fi接続を行い、静止画を一枚撮影してPCに転送します。

```
$ sonycam still
sudo bash /home/kota65535/sony_camera_remote_api/scripts/connect.sh DIRECT-5HH5:HDR-AZ1 9gkH5XW8 wlan3

  ...(wpa_supplicantのログがバーッと出る)...
  
Connected successfully.
Route added successfully.
Initializing camera...
Camera initialization finished.
I, [2016-10-05T03:39:20.639442 #27888]  INFO -- Camera: Capturing...
I, [2016-10-05T03:39:24.449122 #27888]  INFO -- Camera: Capture finished. (3.81 sec)
I, [2016-10-05T03:39:24.580379 #27888]  INFO -- Camera: Transferring DSC03192.JPG...
I, [2016-10-05T03:39:26.509468 #27888]  INFO -- Camera: Transferred DSC03192.JPG. (1.93 sec)
```

各サブコマンドはオプションを与えることで画質や連写速度などの設定を変更できます。例えば動画フォーマットをXAVC Sに変更するなら`--format 'XAVC S'`といった感じです。どのようなオプションが存在するかは、`sonycam help <COMMAND>`で確認することができます。また、`--setting`オプションで各設定の現在の値と、設定可能な値を確認することができます。`"=>"`で示された値が現在の設定値です。

```
$ sonycam movie --format 'XAVC S' --setting
Already connected.
Route already configured.
Initializing camera...
Camera initialization finished.
Movie File Format:
   * MP4 
  => XAVC S 
Movie Quality:
   * 50M 60p 
  => 50M 30p 
   * 50M 24p 
Steady Mode:
   * on 
  => off 
Color Setting:
  => Neutral 
   * Vivid 

...(省略)...
```


## まだまだ発展途上です

本ライブラリは、本来ならばSony Camera Remote APIの対応機種全てでテストを行いたいところですが、体がいくつあっても足りないので4機種でテストを実施しています（HDR-AZ1, FDR-X1000V, DSC-RX100M4, ILCE-QX1）。もし何か不都合な動作などがありましたら、気軽に[こちら](https://github.com/kota65535/sony_camera_remote_api)へIssueを投げて下さい。
また、リモート再生機能などラッパーメソッドを未実装の機能がいくつかあるので、こちらも今後対応予定です。

自作ライブラリを公開するのは初なので、いろいろと未熟な部分があるかもしれませんが、今後ともよろしくお願いします。ここまで読んで下さりありがとうございました！