以前就摸过这个机器 :瘸腿巨人:Sony-ILX-LR1,全画幅编程相机 。但是最重要的开发部分没有写,今天就补上(鸽太久了,稿子都臭了)https://support.d-imaging.sony.co.jp/app/sdk/licenseagreement_d/en.html
之前是移动的SDK,就是适配了不少相机,但是后来出的高端机型就走了另外一套SDK,就是现在文章出现的这个。我把这四个平台做了划分,首先就是三大平台,Win,Linux,MAC,接下来是移动平台,分了v7和v8,至于区别,在手册里面写的是demo机器v7是树莓派2代,很久远。现在的A系列,就是应用处理器,其实就是v8的架构,代表的有地平线,Jetson,树莓派4代这些。就是空中平台肯定就是Linux-ARM这些可以实时处理流视频的板子了。Sony SDK 是为 带有操作系统(Linux/macOS/Windows) 的系统设计的,需使用:
因为图像处理需要大量的资源,比如缓存,数据吞吐,计算什么的。如果非要加嵌入式进来,那就可以使用串口来控制。SPI也可以交互,但是一般不用,SPI留给别的传感器,而且SPI是要时钟的,异步不了,串口就很常见了。Linux机器使用USB连接相机。- GPIO / 中断信号(如 STM32 给 Jetson 触发信号拍照)
- 电源同步(Jetson 唤醒相机或 STM32 控制供电)
SDK是C++的,但是不耽误逻辑,就是把载荷解读出来状态机控制现在的SDK是比以前的功能丰富了,第一个是视频流的处理,讲解如何在 Linux 系统中使用 GStreamer 框架,实现 Remote SDK 视频播放功能(即回放录像功能)的解码与播放流程。我们开发感兴趣的是Sample Application Build,上面是解压的目录其实这个SDK,我们看不到任何的实现,它是给了编译好的库,暴露了API而已。这次SDK把OpenCV也塞进来了,啧啧,官方喂饭?手册用于说明 Sony Camera Remote SDK 提供的所有 API 接口,涵盖相机远程控制、内容传输、回放控制、监控流、固件升级等功能,适合开发远程拍摄系统、多相机同步、实验平台自动控制等应用。也是我们开发的时候需要唯一看的东西。所有 API 都通过 ICrCameraObject 控制对象调用,通信方式包括 USB / LAN / Wi-Fi(取决于相机型号)。可同时控制多台相机(SDK 3.00起支持),所有图像和视频数据通过 buffer 回传,需自行保存或解码。开发就这4个文件的支持,你要说官方支持在哪里?可能在东京?但是国内可能会被我看到(解决不解决是另外一个故事)官方是给了一个非常性感的就像老母猪戴胸罩的demo显示所有连接相机(支持 USB / IP),用户输入编号,选中要连接的相机。这个demo呢,说了很多有益的实践,比如对异步机器的操作,要频繁的使用回调:这个AD真的是什么也不挑,这东西你能打开吗?就是这两个库文件。- 加载 libmonitor_protocol.so
- 将数据解码(MJPEG/H.264)以供分析或显示
描述了一个完整的 SDK 使用流程,包括程序(用户代码)、SDK、和相机三者之间的调用关系。- Program:应用程序代码(写的 C++ 主控逻辑)
- Camera Remote SDK:Sony 提供的 API 库,封装了底层通信与协议
- Camera:Sony 相机本体(通过 USB/WiFi 连接)
Call back functions:部分功能(如内容传输、LiveView、播放)会注册 回调函数,由 SDK 异步通知:
回调我一会儿会说,因为你不知道相机什么时候响应,又不能啥也不干,一直等着它。这段也关键,对 Sony Camera Remote SDK 的连接机制 进行的详细解释,涵盖了从枚举相机对象到建立连接、使用设备句柄控制相机、再到断开连接的整个生命周期。ICrEnumCameraObjectInfo::GetCameraObjectInfo(CrInt32 index)
通过传入 index(枚举编号),获取某一台相机的信息对象 ICrCameraObjectInfo。通常先枚举所有相机 → 再通过这个接口获取其中一个的详细对象。使用 ICrCameraObjectInfo 调用 Connect() 连接相机但在调用 Connect() 之前,必须先准备好一个 IDeviceCallback 对象。因为 SDK 是异步连接机制,连接成功/失败都是通过回调通知的。实现一个继承自 IDeviceCallback 的类,重写回调方法把这个对象注册到 SDK:camera->SetCallback(myCallback);然后再调用 Connect(),才能正常获得通知!只有在 OnConnected() 被调用之后,你才可以开始使用相机Connect() 返回的是 CrDeviceHandle
必须等待 OnConnected() 回调被触发,才表示可以使用设备。- 异步等待回调:OnDisconnected() 被触发
- 然后你可以调用 ReleaseDevice() 清理资源
使用 Sony Remote SDK 连接相机时,必须通过回调机制确认连接/断开是否完成。Connect() 返回句柄后,并不意味着设备可用了,必须等待 OnConnected() 回调才可进行操作。一切控制指令都通过设备句柄发出,断开连接也同样通过 OnDisconnected() 回调确认完成。接下来我觉得重要的是这个,其实还是上面的内容。展示相机连接流程的异步架构,并附带详细说明。它解释了调用 Connect() 实际上只是启动连接过程,而真正的连接成功或失败由回调函数通知。程序调用 camera->Connect(),发起连接请求注意:这一步只是“发起请求”,并不代表已经连接成功!SDK 启动一个独立的线程用于连接相机(非阻塞),连接线程尝试与相机建立连接。- 失败 → 回调 OnError()(例如相机不在或不兼容)
必须实现 IDeviceCallback::OnConnected(),等它被调用,才可以安全控制相机。协议版本固定:Device_Connection_Version_RCP3 = 300当前 SDK 只支持 Remote-Control Protocol Version 3,连接建立成功时,OnConnected() 回调会返回这个协议版本号。Connect() 并不会立刻建立连接,它只是启动连接过程(后台开线程)。SDK 是异步的,不能在 Connect() 之后马上用相机,你不知道连接什么时候完成,只有回调才能告诉你“现在可以用了”。所有后续操作(拍照、设置参数、Live)都必须等 OnConnected() 回调之后才能执行。异步架构 = 你发出指令之后,不等它完成就继续干别的事,真正的完成情况通过回调函数、事件或通知来告诉你。为什么要这样设计?就是因为机器不确定,DJI的SDK也是大量这样的设计。
为了不阻塞主线程、保持高响应性,SDK 设计为异步:
创建 MyCallback : public IDeviceCallback实现 OnConnected() 等函数,在这些函数里再触发你的业务逻辑,主程序只负责初始化 & 事件循环,不阻塞等结果。相机除了没有屏幕(贵,不过这个是我的缺点)以外都非常的好。你问我有没有后续的开发计划,那自然是有的,敬请期待!https://www.sony.com.sg/electronics/camera-lenses/sel1635gm