はじめに
Python から Sony のカメラ (α / Cyber-shot) を制御したい motivation があったので、その際の作業メモとして記述しています。
環境
カメラ
開発環境
- Windows10 Pro Fall Creators Update (1709)
- PowerShell 5.1.16299.98
- Python 3.6.4 (Anaconda 上に構築)
- Sony Camera Remote API beta SDK v 2.40
カメラと PC の接続
まずは、カメラと開発環境となる PC を WiFi で接続します。
α7M2 の場合
- 「内蔵版」のアプリが表示される場合は、一旦スマートリモコンアプリのアップデートを推奨
- 「内蔵版」の場合、APIから利用できる機能が制限される
- アプリ一覧から
スマートリモコン
を選択 - カメラの画面上に表示される SSID/パスワード のアクセスポイントへ PC を接続
- ※ 画像は「内蔵版」の場合
- 画面上に QR コードが表示されている場合は、カメラの削除ボタン (C4) を押すことでパスワード表示画面へ切り替わる
- カメラの表示が
接続中
に切り替われば、カメラと PC の接続が完了
REST API の動作確認
Python 上から API を叩く前に、まずは基本機能をコマンドライン上から実行し、動作確認をしてみます。
以下、PowerShell 上で実行する場合の手順を記載しますが、curl
コマンド等からも同等の手順が行えるはずです。
共通事項
- 接続先の URL は、 http://192.168.122.1:8080/sony/camera を利用する
- API のリファレンスには SSDP を利用してカメラを探索する手順が記載されていますが、カメラと PC を1対1で接続する場合は不要です。
- 原則 HTTP の
POST
メソッドを使用する-
GETP 等では
501 Not Implemented` が返りエラーとなります。
-
カメラを撮影モードに切り替える
startRecMode
API を実行すると、カメラが撮影モードへ切り替わります。
通常、カメラと PC の接続を確立したら、まずはこれを実行しましょう。
カメラ側の画面がライブビューの映像に切り替われば成功です。
> Invoke-WebRequest -Uri http://192.168.122.1:8080/sony/camera -Method POST -Body '{"method":
"startRecMode", "params": [], "id": 1, "version": "1.0"}'
StatusCode : 200
StatusDescription : OK
Content : {"result":[0],"id":1}
RawContent : HTTP/1.1 200 OK
Connection: close
Content-Length: 21
Content-Type: application/json
{"result":[0],"id":1}
Forms : {}
Headers : {[Connection, close], [Content-Length, 21], [Content-Type, application/json]}
Images : {}
InputFields : {}
Links : {}
ParsedHtml : mshtml.HTMLDocumentClass
RawContentLength : 21
写真を撮影する
actTakePicture
API を実行すると、現在の設定で写真が1枚撮影されます。
復帰値の "result"
に格納された URL へアクセスすると、撮影画像を取得することができます。
> Invoke-WebRequest -Uri http://192.168.122.1:8080/sony/camera -Method POST -Body '{"method":
"actTakePicture", "params": [], "id": 1, "version": "1.0"}'
StatusCode : 200
StatusDescription : OK
Content : {"result":[["http:\/\/192.168.122.1:8080\/postview\/memory\/DCIM\/100MSDCF\/DSC0XXXX.JPG?size=Scn"]
],"id":1}
RawContent : HTTP/1.1 200 OK
Connection: close
Content-Length: 108
Content-Type: application/json
{"result":[["http:\/\/192.168.122.1:8080\/postview\/memory\/DCIM\/100MSDCF\/DSC0XXXX.JPG?size=Scn"]
],"id":1}
Forms : {}
Headers : {[Connection, close], [Content-Length, 108], [Content-Type, application/json]}
Images : {}
InputFields : {}
Links : {}
ParsedHtml : mshtml.HTMLDocumentClass
RawContentLength : 108
ホワイトバランスを変更する
setWhiteBalance
API を実行すると、撮影時のホワイトバランスを変更することができます。
プリセットされたシーンの他、色温度を直接指定することもできます。
> Invoke-WebRequest -Uri http://192.168.122.1:8080/sony/camera -Method POST -Body '{"method":
"setWhiteBalance", "params": ["Color Temperature", true, 2500], "id": 1, "version": "1.0"}'
StatusCode : 200
StatusDescription : OK
Content : {"result":[0],"id":1}
RawContent : HTTP/1.1 200 OK
Connection: close
Content-Length: 21
Content-Type: application/json
{"result":[0],"id":1}
Forms : {}
Headers : {[Connection, close], [Content-Length, 21], [Content-Type, application/json]}
Images : {}
InputFields : {}
Links : {}
ParsedHtml : mshtml.HTMLDocumentClass
RawContentLength : 21
次回
実際に Python 上から API を実行してみます。