非官方 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.
HERO3/HERO3+/HERO2 (auth):
这些相机使用传统的/camera/ 或 /bacpac/ GoPro API, 现在已被弃用, 从HERO 4开始已经被新相机的gpControl所代替.
用法:
你可以用这个类库做很多事情, 以下是一些命令如何使用的片段:
fromgoprocamimportGoProCamera
fromgoprocamimportconstants
gpCam = GoProCamera.GoPro()
注意: 你可以使用 来初始化, 它会检测连接哪台相机以及使用哪个 API, 因为我只测试了 HERO4 和 HERO3, 可能不太可靠. 如果你想连接指定的相机, 可以使用 HERO4/5/HERO+ 的 和 HERO3/HERO3+ 的 .
如果你想为相机指定特定的 MAC 地址(只支持 HERO4/5/HERO+):
重要:对 HERO5 Session/Black 和 HERO4 Session, 这是必须的.
注意: 某些命令仅适用于 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 及以上
命令 让你可以修改相机的所有设置. 结构如下:
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)
大部分设置都在 中. 但在 GoPro Setup 部分发现某些设置在 中, 同时 Capture 设置在 中.
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)
状态
你可以获取所有可用状态.
将显示相机的简单概述, 例如:
对于 HERO4 及以上:
currentmode:Video
currentsubmode:Video
currentvideoresolution: 1080p
currentvideoframerate: 30
picturestaken: 78
videostaken: 17
videosleft: 01:42:46
picturesleft: 3916
batteryleft:NearlyEmpty
spaceleftinsdcard: 24.27GB
cameraSSID:KonradHERO4Black
IsRecording:Notrecording-standby
Clientsconnected: 1
cameramodel:HERO4Black
camerassidname:KonradHERO4Black
firmwareversion:HD4.02.05.00.00
对于HERO3/3+:
currentmode: Video
currentvideo resolution: 1080p
currentphoto resolution: 12mp
currenttimelapse interval: 1s
currentvideo Fov: Wide
statuslights:OFF
recording:OFF
HERO4 及以上:
状态信息分为两部分, 状态和设置.
在状态中, 一般会返回相机概况, 如拍摄的照片数目, 剩余电量, 当前模式…
在设置中, 从指定的 id 返回状态, 这个 id 是一条来自 gpControlSet() 常量文件中的命令.
你可以使用 getStatus() 来查询状态信息.
gpCam.getStatus(constants.Status.Status,constants.Status.STATUS.Mode)#Gets current mode status
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+:
与 非常相似, 它可以返回你想要获取的输入的任何值.
状态信息在 中, 这将返回原始值.
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)
>>> 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][] #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
译者:郭明
领取专属 10元无门槛券
私享最新 技术干货