現(xiàn)相機(jī)直連手機(jī):PTP協(xié)議、USB通信和圖片傳輸優(yōu)化實(shí)踐)
在很多攝影類應(yīng)用中有一個(gè)需求越來越常見讓專業(yè)相機(jī)拍攝的照片可以快速進(jìn)入手機(jī)。例如活動(dòng)照片直播商業(yè)攝影婚禮拍攝攝影工作流應(yīng)用相機(jī)輔助App用戶看到的效果可能只是拍照 → 手機(jī)出現(xiàn)照片。但是對于開發(fā)者來說背后涉及USB設(shè)備通信相機(jī)協(xié)議解析圖片數(shù)據(jù)傳輸文件管理多設(shè)備兼容今天從開發(fā)角度分析一下Android相機(jī)直連手機(jī)的實(shí)現(xiàn)過程。一、為什么相機(jī)連接不是簡單讀取文件很多開發(fā)者第一次接觸相機(jī)連接功能時(shí)會(huì)想到“相機(jī)不就是一個(gè)存儲(chǔ)設(shè)備嗎”直接讀取里面的照片不就可以了嗎實(shí)際上專業(yè)相機(jī)和普通U盤有很大區(qū)別。相機(jī)通常采用PTPPicture Transfer Protocol圖片傳輸協(xié)議。它不是通過文件目錄暴露照片。而是通過指令通信。例如App發(fā)送獲取相機(jī)設(shè)備信息相機(jī)返回當(dāng)前設(shè)備型號(hào)、存儲(chǔ)狀態(tài)等信息App發(fā)送獲取照片列表相機(jī)返回當(dāng)前存儲(chǔ)卡中的圖片信息App發(fā)送下載指定圖片相機(jī)返回圖片二進(jìn)制數(shù)據(jù)整個(gè)過程更像設(shè)備之間的通信。二、Android相機(jī)連接的核心架構(gòu)一個(gè)完整的相機(jī)連接方案通??梢圆鸪蓭讉€(gè)模塊相機(jī)設(shè)備 ↓ USB通信層 ↓ PTP協(xié)議解析層 ↓ 文件管理層 ↓ 傳輸優(yōu)化層 ↓ App業(yè)務(wù)層1. USB通信層負(fù)責(zé)發(fā)現(xiàn)外部設(shè)備建立USB連接數(shù)據(jù)發(fā)送和接收Android提供USB Host API可以讓手機(jī)作為主機(jī)連接外部設(shè)備。開發(fā)過程中需要處理USB權(quán)限申請?jiān)O(shè)備枚舉Endpoint通信數(shù)據(jù)讀取2. PTP協(xié)議解析層這是相機(jī)連接的核心。PTP協(xié)議主要包含Device信息獲取相機(jī)型號(hào)支持能力Storage管理獲取存儲(chǔ)卡信息圖片數(shù)量Object管理對應(yīng)圖片文件視頻文件縮略圖開發(fā)者需要把底層數(shù)據(jù)轉(zhuǎn)換成App可以理解的數(shù)據(jù)結(jié)構(gòu)。三、為什么照片傳輸速度容易成為問題現(xiàn)在相機(jī)照片越來越大。普通JPEG幾MB。RAW照片幾十MB。如果傳輸方案設(shè)計(jì)不好很容易出現(xiàn)速度慢內(nèi)存占用高UI卡頓連接中斷1. 不應(yīng)該一次加載整個(gè)文件錯(cuò)誤方式讀取完整圖片 ↓ 存入內(nèi)存 ↓ 保存手機(jī)大文件情況下容易造成內(nèi)存壓力。更合理圖片數(shù)據(jù) ↓ 分塊讀取 ↓ 持續(xù)寫入 ↓ 完成保存2. 數(shù)據(jù)傳輸需要異步處理USB通信不能阻塞主線程。否則用戶打開App。連接相機(jī)。整個(gè)界面卡死。通常需要工作線程回調(diào)機(jī)制消息隊(duì)列保證連接和傳輸不會(huì)影響UI。3. 需要處理異常情況真實(shí)環(huán)境中USB連接并不一定穩(wěn)定??赡艹霈F(xiàn)用戶拔線相機(jī)休眠手機(jī)權(quán)限變化數(shù)據(jù)傳輸失敗商業(yè)級(jí)方案需要自動(dòng)重連。狀態(tài)恢復(fù)。錯(cuò)誤處理。四、多品牌相機(jī)兼容為什么困難市面上常見品牌CanonSonyNikonFujifilmPanasonic很多設(shè)備都支持PTP。但是不同廠商會(huì)增加自己的擴(kuò)展功能。例如有些支持獲取縮略圖有些支持遠(yuǎn)程控制有些支持實(shí)時(shí)預(yù)覽所以開發(fā)相機(jī)連接功能時(shí)協(xié)議兼容是一個(gè)長期問題。五、相機(jī)連接為什么越來越重要以前攝影流程拍攝?!】??!娔X導(dǎo)入?!迗D?!桓丁,F(xiàn)在很多場景需要拍攝完成?!謾C(jī)立即接收?!鼳I自動(dòng)修圖?!悄苷{(diào)色?!焖俜窒?。尤其照片直播。活動(dòng)攝影。商業(yè)拍攝。對效率要求越來越高。六、未來相機(jī)連接會(huì)結(jié)合AI影像未來相機(jī)連接不只是傳照片。更可能成為影像智能入口。例如相機(jī)拍攝?!詣?dòng)傳輸手機(jī)?!鼳I識(shí)別人像?!詣?dòng)調(diào)色。↓生成多個(gè)分享版本。相機(jī)、手機(jī)、AI算法會(huì)形成完整工作流。總結(jié)實(shí)現(xiàn)一個(gè)穩(wěn)定的Android相機(jī)連接功能并不是簡單的數(shù)據(jù)傳輸。真正需要解決USB通信PTP協(xié)議圖片傳輸優(yōu)化多品牌兼容穩(wěn)定性設(shè)計(jì)對于攝影App、照片直播、影像工具開發(fā)來說相機(jī)連接能力正在成為越來越重要的基礎(chǔ)技術(shù)。如果你正在開發(fā) 攝影類App 相機(jī)連接功能? 圖像處理應(yīng)用 照片直播系統(tǒng)歡迎交流Android USB通信、PTP協(xié)議以及影像SDK開發(fā)經(jīng)驗(yàn)。另外我這里有demo可以測試