以前就摸過這個機(jī)器 :瘸腿巨人:Sony-ILX-LR1,全畫幅編程相機(jī)?。但是最重要的開發(fā)部分沒有寫,今天就補(bǔ)上(鴿太久了,稿子都臭了)以前這個SDK的位置很好找,現(xiàn)在真的是藏的很深:https://support.d-imaging.sony.co.jp/app/sdk/licenseagreement_d/en.html
之前是移動的SDK,就是適配了不少相機(jī),但是后來出的高端機(jī)型就走了另外一套SDK,就是現(xiàn)在文章出現(xiàn)的這個。我把這四個平臺做了劃分,首先就是三大平臺,Win,Linux,MAC,接下來是移動平臺,分了v7和v8,至于區(qū)別,在手冊里面寫的是demo機(jī)器v7是樹莓派2代,很久遠(yuǎn)。現(xiàn)在的A系列,就是應(yīng)用處理器,其實(shí)就是v8的架構(gòu),代表的有地平線,Jetson,樹莓派4代這些。就是空中平臺肯定就是Linux-ARM這些可以實(shí)時處理流視頻的板子了。Sony SDK 是為 帶有操作系統(tǒng)(Linux/macOS/Windows) 的系統(tǒng)設(shè)計的,需使用:- 動態(tài)庫加載(.so/.dll/.dylib)
因?yàn)閳D像處理需要大量的資源,比如緩存,數(shù)據(jù)吞吐,計算什么的。如果非要加嵌入式進(jìn)來,那就可以使用串口來控制。SPI也可以交互,但是一般不用,SPI留給別的傳感器,而且SPI是要時鐘的,異步不了,串口就很常見了。Linux機(jī)器使用USB連接相機(jī)。加入了嵌入式,那實(shí)現(xiàn)的功能就非常的豐富了!- GPIO / 中斷信號(如 STM32 給 Jetson 觸發(fā)信號拍照)
- 電源同步(Jetson 喚醒相機(jī)或 STM32 控制供電)
SDK是C++的,但是不耽誤邏輯,就是把載荷解讀出來狀態(tài)機(jī)控制現(xiàn)在的SDK是比以前的功能豐富了,第一個是視頻流的處理,講解如何在 Linux 系統(tǒng)中使用 GStreamer 框架,實(shí)現(xiàn) Remote SDK 視頻播放功能(即回放錄像功能)的解碼與播放流程。因?yàn)樗俣炔黄ヅ洌褂昧谁h(huán)形緩存區(qū)我們開發(fā)感興趣的是Sample Application Build,上面是解壓的目錄其實(shí)這個SDK,我們看不到任何的實(shí)現(xiàn),它是給了編譯好的庫,暴露了API而已。這次SDK把OpenCV也塞進(jìn)來了,嘖嘖,官方喂飯?手冊用于說明 Sony Camera Remote SDK 提供的所有 API 接口,涵蓋相機(jī)遠(yuǎn)程控制、內(nèi)容傳輸、回放控制、監(jiān)控流、固件升級等功能,適合開發(fā)遠(yuǎn)程拍攝系統(tǒng)、多相機(jī)同步、實(shí)驗(yàn)平臺自動控制等應(yīng)用。也是我們開發(fā)的時候需要唯一看的東西。所有 API 都通過?ICrCameraObject?控制對象調(diào)用,通信方式包括 USB / LAN / Wi-Fi(取決于相機(jī)型號)。可同時控制多臺相機(jī)(SDK 3.00起支持),所有圖像和視頻數(shù)據(jù)通過?buffer?回傳,需自行保存或解碼。開發(fā)就這4個文件的支持,你要說官方支持在哪里?可能在東京?但是國內(nèi)可能會被我看到(解決不解決是另外一個故事)官方是給了一個非常性感的就像老母豬戴胸罩的demo顯示所有連接相機(jī)(支持 USB / IP),用戶輸入編號,選中要連接的相機(jī)。這個demo呢,說了很多有益的實(shí)踐,比如對異步機(jī)器的操作,要頻繁的使用回調(diào):這個AD真的是什么也不挑,這東西你能打開嗎?就是這兩個庫文件。- 加載?libmonitor_protocol.so
- 調(diào)用?StartMonitoring()?
- 將數(shù)據(jù)解碼(MJPEG/H.264)以供分析或顯示
描述了一個完整的 SDK 使用流程,包括程序(用戶代碼)、SDK、和相機(jī)三者之間的調(diào)用關(guān)系。- Program:應(yīng)用程序代碼(寫的 C++ 主控邏輯)
- Camera Remote SDK:Sony 提供的 API 庫,封裝了底層通信與協(xié)議
- Camera:Sony 相機(jī)本體(通過 USB/WiFi 連接)
Call back functions:部分功能(如內(nèi)容傳輸、LiveView、播放)會注冊 回調(diào)函數(shù),由 SDK 異步通知:
回調(diào)我一會兒會說,因?yàn)槟悴恢老鄼C(jī)什么時候響應(yīng),又不能啥也不干,一直等著它。這段也關(guān)鍵,對?Sony Camera Remote SDK 的連接機(jī)制?進(jìn)行的詳細(xì)解釋,涵蓋了從枚舉相機(jī)對象到建立連接、使用設(shè)備句柄控制相機(jī)、再到斷開連接的整個生命周期。ICrEnumCameraObjectInfo::GetCameraObjectInfo(CrInt32 index)
通過傳入?index(枚舉編號),獲取某一臺相機(jī)的信息對象?ICrCameraObjectInfo。通常先枚舉所有相機(jī) → 再通過這個接口獲取其中一個的詳細(xì)對象。使用?ICrCameraObjectInfo?調(diào)用?Connect()?連接相機(jī)但在調(diào)用?Connect()?之前,必須先準(zhǔn)備好一個?IDeviceCallback?對象。因?yàn)?SDK 是異步連接機(jī)制,連接成功/失敗都是通過回調(diào)通知的。實(shí)現(xiàn)一個繼承自?IDeviceCallback?的類,重寫回調(diào)方法把這個對象注冊到 SDK:camera->SetCallback(myCallback);然后再調(diào)用?Connect(),才能正常獲得通知!只有在?OnConnected()?被調(diào)用之后,你才可以開始使用相機(jī)Connect()?返回的是?CrDeviceHandle
必須等待 OnConnected() 回調(diào)被觸發(fā),才表示可以使用設(shè)備。- 調(diào)用?Disconnect(handle)
- 異步等待回調(diào):OnDisconnected()?被觸發(fā)
- 然后你可以調(diào)用?ReleaseDevice()?清理資源
使用 Sony Remote SDK 連接相機(jī)時,必須通過回調(diào)機(jī)制確認(rèn)連接/斷開是否完成。Connect() 返回句柄后,并不意味著設(shè)備可用了,必須等待?OnConnected()?回調(diào)才可進(jìn)行操作。一切控制指令都通過設(shè)備句柄發(fā)出,斷開連接也同樣通過 OnDisconnected() 回調(diào)確認(rèn)完成。程序其實(shí)難點(diǎn)不在寫,而在于順序。接下來我覺得重要的是這個,其實(shí)還是上面的內(nèi)容。展示相機(jī)連接流程的異步架構(gòu),并附帶詳細(xì)說明。它解釋了調(diào)用 Connect() 實(shí)際上只是啟動連接過程,而真正的連接成功或失敗由回調(diào)函數(shù)通知。程序調(diào)用?camera->Connect(),發(fā)起連接請求注意:這一步只是“發(fā)起請求”,并不代表已經(jīng)連接成功!SDK 啟動一個獨(dú)立的線程用于連接相機(jī)(非阻塞),連接線程嘗試與相機(jī)建立連接。- 成功 → 回調(diào) OnConnected()?
- 失敗 → 回調(diào) OnError()(例如相機(jī)不在或不兼容)
必須實(shí)現(xiàn)?IDeviceCallback::OnConnected(),等它被調(diào)用,才可以安全控制相機(jī)。協(xié)議版本固定:Device_Connection_Version_RCP3 = 300當(dāng)前 SDK 只支持?Remote-Control Protocol Version 3,連接建立成功時,OnConnected()?回調(diào)會返回這個協(xié)議版本號。Connect()?并不會立刻建立連接,它只是啟動連接過程(后臺開線程)。SDK 是異步的,不能在?Connect()?之后馬上用相機(jī),你不知道連接什么時候完成,只有回調(diào)才能告訴你“現(xiàn)在可以用了”。所有后續(xù)操作(拍照、設(shè)置參數(shù)、Live)都必須等?OnConnected()?回調(diào)之后才能執(zhí)行。異步架構(gòu) = 你發(fā)出指令之后,不等它完成就繼續(xù)干別的事,真正的完成情況通過回調(diào)函數(shù)、事件或通知來告訴你。異步(異步架構(gòu)):你媽做好吃的喊你,你扣會兒手機(jī)為什么要這樣設(shè)計?就是因?yàn)闄C(jī)器不確定,DJI的SDK也是大量這樣的設(shè)計。- 相機(jī)響應(yīng)時間不確定(USB/WiFi 通信)
- 一些設(shè)備需要準(zhǔn)備時間(特別是連接、取景、拍照等)
為了不阻塞主線程、保持高響應(yīng)性,SDK 設(shè)計為異步:
創(chuàng)建?MyCallback : public IDeviceCallback實(shí)現(xiàn) OnConnected() 等函數(shù),在這些函數(shù)里再觸發(fā)你的業(yè)務(wù)邏輯,主程序只負(fù)責(zé)初始化 & 事件循環(huán),不阻塞等結(jié)果。SONY的菜單一直就風(fēng)評不好,盲拍嗎?所以要準(zhǔn)備一套HDMI的捕獲設(shè)備相機(jī)除了沒有屏幕(貴,不過這個是我的缺點(diǎn))以外都非常的好。你問我有沒有后續(xù)的開發(fā)計劃,那自然是有的,敬請期待!https://www.sony.com.sg/electronics/camera-lenses/sel1635gm