#camera #gopro #bluetooth #hero #api-bindings

gopro-controller

使用BLE和WiFi与GoPro相机交互的开源Rust库

2个版本

0.10.5 2023年11月23日
0.10.2 2023年11月18日
0.9.0 2023年11月14日
0.8.1 2023年11月11日

#212 in 多媒体

自定义许可证

56KB
1K SLoC

gopro-controller

使用BLE和(可能最终)WiFi与GoPro相机交互的开源Rust库

动机

GoPro是很好的小设备,但与它们交互的唯一好方法是使用它们的移动应用,这不可扩展。这个crate希望提供一个起点,以无线方式编程控制相机,并最终使用像Raspberry Pi和其他SBC、微控制器等更DIY友好的计算机从它们下载媒体。

GoPro规范

https://gopro.github.io/OpenGoPro/

支持的相机

  • GoPro Hero 11 Black

我没有其他型号用于测试,因此目前我只能验证Hero 11 Black。所有相机的命令结构看起来都一样,因此它应该与任何支持OpenGoPro规范的相机一起工作,但是相机的设置各不相同,因此我无法保证任何特定的设置与不同型号一起工作。

特性 -- 进行中

  • 连接 *(查看配对说明)
  • 命令
    • 快门开始
    • 快门停止
    • 关机
    • 添加高亮
    • 更改模式
  • 设置
    • 分辨率
    • 帧率
    • 自动关机
    • 视频数字镜头
    • 照片数字镜头
    • 时间间隔数字镜头
    • 媒体格式
    • 防闪烁
    • 超级平滑
    • 水平校正
    • 最大镜头
    • 回望
    • 控制
    • 速度
    • 夜景照片
    • 无线频段
    • 轨迹长度
    • 视频模式
  • 查询相机状态和设置
  • 以人类友好的方式解释相机状态
  • 从相机下载媒体
  • 实时预览
  • WiFi支持
  • 更多相机型号
  • 支持Protobuf

注意事项

BLE

在冷启动时,蓝牙低功耗(BLE)也显得有点不稳定。要让配对工作(或者在GoPro在10小时不活动后完全进入睡眠状态后重新连接)可能需要多次关闭和打开相机,或者拔出并重新插入电池。

配对

目前,库无法第一次配对相机。您必须通过将相机置于配对模式(首选项 -> 无线连接 -> 连接设备 -> GoPro Quik应用程序)并在系统蓝牙设置中进行连接,与您的系统配对相机。一旦相机配对,您就可以在不进入配对模式下从这个库中连接到它。

自动唤醒

关闭后,相机将继续发送广告数据包长达10小时。在这段时间内,重新连接到它将导致其唤醒并继续在预设的位置空闲。

支持的平台

这个库目前仅在Linux上进行了测试,尽管它并不打算是特定平台的。

基本用法

use gopro_controller::{connect, init, scan, GoProCommand};
use std::time::Duration;
use tokio::time;

let mut central = init(None).await.unwrap();
let mut devices = scan(&mut central).await.unwrap();
devices.retain(|d| d.contains("GoPro"));
assert!(devices.len() > 0, "No GoPro devices found");

let gopro = connect(devices.first().unwrap().clone(), &mut central)
  .await
  .unwrap();

println!("Connected to GoPro");

time::sleep(Duration::from_secs(4)).await;
println!("Starting Shutter");
gopro
  .send_command(GoProCommand::ShutterStart)
  .await
  .unwrap();

//Record for 3 Seconds
time::sleep(Duration::from_secs(3)).await;
println!("Stopping Shutter");
gopro.send_command(GoProCommand::ShutterStop).await.unwrap();

time::sleep(Duration::from_secs(2)).await;
println!("Powering Off");
gopro.disconnect_and_poweroff().await.unwrap();

依赖关系

~5–34MB
~509K SLoC