當前位置:
首頁 > 知識 > GoPro Python API

GoPro Python API

GoPro Python API

Python部落(python.freelycode.com)組織翻譯,禁止轉載,歡迎轉發。

非官方 Python GoPro API 庫 - 通過 WiFi 連接 GoPro 相機

(可以電腦打開閱讀原文鏈接,留日後查閱)

兼容性:
  • HERO3

  • HERO3+

  • HERO4 (包括 HERO Session)

  • HERO+

  • HERO5 (包括 HERO5 Session)

  • HERO6

  • Fusion 1

安裝

通過 PyPi:


pip install goprocam

Git(不穩定)


git clone http://github.com/konradit/gopro_py_api
cd gopro-py-api
python setup.py install

基於 Python 3.6.0 測試 -- 適用於 Linux, Windows 和 Mac

文檔:HERO4 以及最新 (gpcontrol)

這些相機使用以 /gp/gpControl/ url 為中心的新版 GoPro API.

GoPro Python API

GoPro Python API

HERO3/HERO3+/HERO2 (auth):

這些相機使用傳統的/camera/ 或 /bacpac/ GoPro API, 現在已被棄用, 從HERO 4開始已經被新相機的gpControl所代替.

GoPro Python API

GoPro Python API

用法:

你可以用這個類庫做很多事情, 以下是一些命令如何使用的片段:


from goprocam import GoProCamera
from goprocam import constants

gpCam = GoProCamera.GoPro

注意: 你可以使用 GoProCamera.GoPro來初始化, 它會檢測連接哪台相機以及使用哪個 API, 因為我只測試了 HERO4 和 HERO3, 可能不太可靠. 如果你想連接指定的相機, 可以使用 HERO4/5/HERO+ 的GoProCamera.GoPro(constants.gpcontrol)和 HERO3/HERO3+ 的GoProCamera.GoPro(constants.auth).

如果你想為相機指定特定的 MAC 地址(只支持 HERO4/5/HERO+):

重要:對 HERO5 Session/Black 和 HERO4 Session, 這是必須的.

GoProCamera.GoPro(mac_address="...")

注意: 某些命令僅適用於 HERO4/5, 反之亦然: gpControlCommand/gpControlSet/gpControlExecute 僅適用於 HERO4/5, sendBacpac/sendCamera 僅適用於 HERO3/3+. 根據你的相機確保使用正確的getStatus常量.

命令
  • 啟動, 停止

你可以啟動或關閉視頻, 同樣也可拍照或延時拍攝. 可應用於所有相機.

啟動視頻或拍照:


gpCam.shutter(constants.start)

關閉視頻或延時拍攝:


gpCam.shutter(constants.stop)

  • 改變模式

你可以改變相機模式. 第二行僅適用於 HERO4 Black/Silver/Session 和 HERO5 Black/Session(由於他們具有模式和子模式).


gpCam.mode(constants.Mode.VideoMode)
gpCam.mode(constants.Mode.VideoMode, constants.Video.SubMode.Looping)

  • 高亮標籤

只針對 HERO4 及以上版本: 可以在視頻中設置高亮標籤.

gpCam.hilight

  • 定位相機

這會使相機發出嘟嘟聲.


gpCam.locate(constants.start)
...
gpCam.locate(constants.stop)

  • 打開或關閉相機

根據你指定的相機, 你可以使用單獨的命令打開或關閉它.對於 HERO4 及以上版本(gpcontrol):


gpCam.power_on

HERO3/3+ (auth):


gpCam.power_on_auth

關閉時, 不管用哪種相機:


gpCam.power_off

  • 快速攝像

只需一條命令即可快速捕捉照片, 如果你願意, 也可以設定一個計時器. 這適用於所有相機.


gpCam.take_photo(10) #will wait 10 seconds before taking the picture

將會返回照片的 URL.

  • 快速攝影

只需一條命令即可開始攝影, 你也可以指定影片的時長, 如果不指定, 攝影不會停止. 這適用於所有相機.


gpCam.shoot_video #starts a video
gpCam.shoot_video(40) #shoots a 40 second video

  • 快速修改視頻解析度

此命令會設置指定的視頻解析度和幀率, 參數間以逗號分隔. 確保你的相機支持指定的視頻解析度和幀率.


gpCam.video_settings("1080p","30")
gpCam.video_settings("1440p")

  • 設置正確的時間

GoPro 相機需設置時鐘, 否則媒體的元數據將會不正確.


gpCam.syncTime

修改設置

根據你擁有的相機, 你可以使用指定的命令來修改設置.

  • HERO4 及以上

命令 gpControlSet讓你可以修改相機的所有設置. 結構如下:


gpCam.gpControlSet(constants.Setup.COMMAND_NAME, constants.Setup.CommandName.Parameter)

因此, 可以這樣關閉相機的嘟嘟聲:


gpCam.gpControlSet(constants.Setup.BEEP, constants.Setup.Beep.OFF)

constants 命令分成了不同的部分:

* Video
* Photo
* Multishot
* Setup

每個部分都有不同的命令和參數, 所以上面提到的 beep 命令是在 Setup 中的.

對視頻, 照片和多鏡頭, 你可以改變解析度, protune值, 並且在模式中, 你可以修改特定的模式命令. 比如修改 Multishot 的 TimeLapse 時間間隔為10秒:


gpCam.gpControlSet(constants.Multishot.TIMELAPSE_INTERVAL, constants.Multishot.TimeLapseInterval.I10)

或者修改視頻模式到視頻+照片子模式的時間間隔為30分鐘:


gpCam.gpControlSet(constants.Video.VIDEO_PHOTO_INTERVAL, constants.Video.VideoPhotoInterval.Interval30Min)

關於可用設置的完整列表, 請查看 constants.py 文件.

  • HERO3 / HERO3+

對於 HERO3/HERO3+ 相機, 有一點不同, 因為他們使用了舊版本的 API, 命令與 HERO4 不同.


gpCam.sendCamera(constants.Hero3Commands.COMMAND_NAME, constants.Hero3Commands.CommandName.Parameter)

大部分設置都在 constants.Hero3Commands中. 但在 GoPro Setup 部分發現某些設置在constants.Hero3Commands.Setup中, 同時 Capture 設置在constants.Hero3Commands中.

  • Hero3Commands:

    • BURST_RATE

    • PHOTO_RESOLUTION

    • CONTINOUOUS_RATE

    • TIMELAPSE_RATE

    • FOV

    • FRAME_RATE

    • VIDEO_RESOLUTION

  • Setup:

    • BEEP

    • ONE_BTN_MODE

    • ON_SCREEN_DISP

    • DEFAULT_MODE

    • LED

    • NTSC

  • Capture Settings:

    • COLOR_PROFILE

    • SHARPNESS

    • EXPOSURE_COMP

    • SPOT_METER

    • ISO

    • VIDEO_PHOTO_INTERVAL

    • LOOPING_VIDEO

    • WHITE_BALANCE

    • ORIENTATION

    • PROTUNE

    • 只針對 HERO3+ Black Cameras:

gpCam.sendCamera(constants.Hero3Commands.BURST_RATE, constants.Hero3Commands.BurstRate.BU10_1)
gpCam.sendCamera(constants.Hero3Commands.Setup.LED, constants.Hero3Commands.Setup.StatusLight.OFF)
gpCam.sendCamera(constants.Hero3Commands.CaptureSettings.PROTUNE, constants.Hero3Commands.CaptureSettings.ProTune.ON)

狀態

你可以獲取所有可用狀態.

gpCam.overview將顯示相機的簡單概述, 例如:

對於 HERO4 及以上:


current mode: Video
current submode: Video
current video resolution: 1080p
current video framerate: 30
pictures taken: 78
videos taken: 17
videos left: 01:42:46
pictures left: 3916
battery left: Nearly Empty
space left in sd card: 24.27GB
camera SSID: KonradHERO4Black
Is Recording: Not recording - standby
Clients connected: 1
camera model: HERO4 Black
camera ssid name: KonradHERO4Black
firmware version: HD4.02.05.00.00

對於HERO3/3+:


current mode: Video
current video resolution: 1080p
current photo resolution: 12mp
current timelapse interval: 1s
current video Fov: Wide
status lights: OFF
recording: OFF

HERO4 及以上:

狀態信息分為兩部分, 狀態和設置.

在狀態中, 一般會返回相機概況, 如拍攝的照片數目, 剩餘電量, 當前模式…

在設置中, 從指定的 id 返回狀態, 這個 id 是一條來自 gpControlSet 常量文件中的命令.

你可以使用 getStatus 來查詢狀態信息.


gpCam.getStatus(constants.Status.Status,constants.Status.STATUS.Mode) #Gets current mode status
0

gpCam.getStatus(constants.Status.Status, constants.Status.STATUS.BatteryLevel) #Gets battery level
3

gpCam.getStatus(constants.Status.Settings, constants.Setup.ORIENTATION) #Gets orientation mode
2

這裡返回的是原始值, 你可以用 parse_value 將其轉化為容易識別的信息.


gpCam.parse_value("video_left",gpCam.getStatus(constants.Status.Status, constants.Status.STATUS.RemVideoTime))
"01:42:50"

gpCam.parse_value("video_res",gpCam.getStatus(constants.Status.Settings, constants.Video.RESOLUTION))
"1080p"

gpCam.parse_value("battery", gpCam.getStatus(constants.Status.Status, constants.Status.STATUS.BatteryLevel))
"Full"

可以使用 infoCamera 來獲取相機信息, 比如相機名稱和固件名稱:


print(gpCam.infoCamera(constants.Camera.Name)) #Gets camera name
HERO4 Black
print(gpCam.infoCamera(constants.Camera.Firmware)) #Gets camera fw version
HD4.02.05.00.00

HERO3 / HERO3+:

sendCamera非常相似, 它可以返回你想要獲取的輸入的任何值.

狀態信息在 constants.Hero3Status.中, 這將返回原始值.


gpCam.getStatus(constants.Hero3Status.WhiteBalance)
"00"
gpCam.getStatus(constants.Hero3Status.IsRecording)
"01"
gpCam.getStatus(constants.Hero3Status.PicRes)
"5"

可以將這些值轉化為我們可理解的信息:


gpCam.parse_value(constants.Hero3Status.PicRes, gpCam.getStatus(constants.Hero3Status.PicRes))
"12mp"
gpCam.parse_value(constants.Hero3Status.TimeLapseInterval, gpCam.getStatus(constants.Hero3Status.TimeLapseInterval))
"1s"
gpCam.parse_value(constants.Hero3Status.Mode, gpCam.getStatus(constants.Hero3Status.Mode))
"Video"

媒體

這是跨平台相機:

  • 獲取拍攝的最新的視頻或相片的 url

print(gpCam.getMedia) #Latest media taken URL
http://10.5.5.9:8080/videos/DCIM/104GOPRO/GOPR2386.JPG

  • 獲取最新媒體的名稱/大小:

print(gpCam.getMediaInfo("file")) #Latest media taken filename
GOPR2386.JPG
print(gpCam.getMediaInfo("size")) #Latest media taken size
14.82MB

  • 下載最新的媒體:

gpCam.downloadLastMedia #Downloads last video/photo taken

  • 下載某個 URL(或者抓取並下載它):

gpCam.downloadLastMedia(gpCam.take_photo(5)) #Waits 5 seconds, takes a photo, downloads it to current directory.
gpCam.downloadLastMedia(gpCam.shoot_video(120)) #Shoots a 120 second video and then downloads it.

  • 下載一個低解析度的視頻:

你可以下載以1080p或者更低解析度錄製的視頻. 這可以加快視頻的傳輸, 但低解析度視頻只能用作高質量視頻的參考.


gpCam.downloadLowRes #video is already recorded, now this downloads the low resolution version
gpCam.downloadLowRes(gpCam.shoot_video(120)) #Record a 120 second video and download it in low resolution

  • 下載相機中的所有視頻:

gpCam.downloadAll #downloads all media
gpCam.downloadAll("photos") #downloads only all photos
gpCam.downloadAll("videos") #downloads all videos

  • 下載指定的視頻:

gpCam.downloadMedia("100GOPRO","GOPR0045.MP4")

  • 獲取視頻元數據:

gpCam.getVideoInfo("dur", "GOPR2524.MP4") #gets video duration
24

gpCam.getVideoInfo("tags", "GOPR2524.MP4") #get an array of hilight tags in ms
[5872, 7907]

gpCam.getVideoInfo("tag_count", "GOPR2524.MP4")
2

  • 刪除:

所有:


gpCam.delete("all")

最新:


gpCam.delete("last")

指定的文件:


gpCam.deleteFile("104GOPRO","GOPR0038.JPG")

  • 列出相機媒體內容:

gpCam.listMedia

將返回相機上可用媒體文件的JSON列表:


{
"id": "3993129928403681535",
"media": [
{
"d": "104GOPRO",
"fs": [
{
"mod": "1490468532",
"n": "GOPR2760.JPG",
"s": "4919786"
},
{
"mod": "1490468536",
"n": "GOPR2761.JPG",
"s": "4942872"
},
{
"mod": "1490468540",
"n": "GOPR2762.JPG",
"s": "4943428"
},

如果你想格式化:


gpCam.listMedia(format=True)

folder: 104GOPRO
GOPR2760.JPG
GOPR2761.JPG
GOPR2762.JPG
GOPR2763.JPG
GOPR2764.MP4
GOPR2765.MP4
GOPR2766.MP4
GOPR2767.MP4
GOPR2768.MP4

將以每行一個的格式返回.

最後, 如果你想返回數組:


gpCam.listMedia(format=True, media_array=True)

[["100GOPRO", "GOPR3132.MP4", "741578340"], ["100GOPRO", "GOPR3133.MP4", "61818786"], ["100GOPRO", "GOPR3134.MP4", "52298492"], ["100GOPRO", "GOPR3135.MP4", "22484879"]]

>>> m=gopro.listMedia(True, True)
>>> m[0] #First media item
["100GOPRO", "GOPR3132.MP4", "741578340"]
>>> m[1] Second media item
["100GOPRO", "GOPR3133.MP4", "61818786"]
>>> m[2] Third media item
["100GOPRO", "GOPR3134.MP4", "52298492"]
>>> m[2][1] #Get name of third media item
"GOPR3134.MP4"
>>> m[2][0] #Get folder of third media item
"100GOPRO"
>>> m[2][2] #Get size (bytes) of first media item
"52298492"

流媒體:

對於流媒體, 類庫提供了以下功能:

這將開啟所有相機的直播流.


gpCam.livestream("start")
gpCam.livestream("stop")

將GoPro流傳輸到另外一個地方, 比如 localhost(需要HERO4/5):


gpCam.stream("udp://localhost:5000")

你也可以設置流的質量, HERO5支持720p!


gpCam.streamSettings(constants.Stream.Bitrate.B4Mbps, constants.Stream.WindowSize.R480) #For HERO4

gpCam.streamSettings(constants.Stream.Bitrate.B4Mbps, constants.Stream.WindowSize.R720) #For HERO5

對於 HERO3, 步驟同上.

請參閱 examples/opencv_gopro 文件夾中的 python 腳本在 openCV 中打開 HERO4/5 源, 並檢測面部. 在 examples/streaming 中有腳本可以將 GoPro 直播流傳輸到Facebook, YouTube 或者 Twitch.

視頻錄屏:
  • HERO4 Black: https://vimeo.com/209079783

  • HERO4 Session: https://vimeo.com/209129019

  • HERO3 Black: https://vimeo.com/209181246

  • HERO5 Black: https://vimeo.com/235135652

英文原文:https://github.com/konradit/gopro-py-api
譯者:郭明

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python部落 的精彩文章:

MySQL 8.0的十大新特性
PhantomJS宣布終止開發

TAG:Python部落 |