有線鏡像投屏簡介
手機投屏到電腦分爲無線和有線兩種方式
無線通過WiFi投屏,基本能實現高清,但是受限於網絡速度, 延遲會比較高, 不適合玩遊戲這種使用場景.
有線投屏 通過usb數據線能實現設備間穩定的連接, 可以高速傳輸數據, 延遲低, 畫面清晰, 適合遊戲, 直播等場景
iOS 有線鏡像投屏原理
MAC系統自帶的 QuickTime Player 在插入Lighting 數據線時, 能實現iOS 屏幕鏡像和錄製, 如圖所示:
可以此爲基礎研究有線投屏的協議, 根據抓包並分析, 可以初步得到協議實現, 分成3個步驟:
1. 啓動投屏
- 啓用隱藏設備配置
- 聲明結束端點
- 等待接收 PING 數據包
- 使用 PING 數據包進行響應
- 等待 SYNC CWPA 數據包接收設備音頻時鐘的時鐘
- 創建本地時鐘,將時鐘ref作爲回覆SYNC CWPA併發送
- 發送ASYN_HPD1
- 發送ASYN_HPA1與步驟 6 中收到的設備音頻時鐘
- 接收 SYNC AFMT,並回復零錯誤代碼
- 使用設備視頻時鐘Ref接收 SYNC CVRP
- 使用本地視頻時鐘Ref進行回覆
- 使用設備的視頻時鐘Ref開始發送 ASYN 需求
- 接收兩個 ASYN 集屬性
- 接收同步 Clok,並回復新創建的時鐘
- 接收兩個 SYNC 時間,並回復兩個 CMTimes
2. 接收數據
視頻和音頻的數據包將由設備發送。我們需要定期發送視頻的 NEED 數據包
3. 關閉投屏
- 從 cwpa 同步數據包發送帶有設備時鐘ref 的 asyn hpa0,告訴設備停止發送音頻
- 發送 hpd0 與空時鐘Ref 停止視頻
- 接收同步停止包,我們創建的視頻時鐘時,cvrp發送給我們,這是在每個饋送數據包
- 回覆以 8 個零字節同步停止
- 接收本地視頻時鐘Ref的 ASYN RELS(在 FEED 數據包中找到的 ASYN RELS)
- 接收 SYNC CLOCK 後創建的本地時鐘的 ASYN RELS
- 釋放 usb 終結點
- 將設備活動配置設置爲僅 usbmux
具體的鏡像協議細節點擊訪問 quicktime_video_hack , 包括一個go 語言的協議實現, 可以運行在Ubuntu 和 MacOS 平臺.
Android 有線鏡像投屏原理
Android系統的有線投屏有2種實現方式, 使用ADB 和 USBAccessory 方式. 缺點是, 不管哪種方式, 目前都不能投屏系統聲音.
使用 ADB 鏡像投屏
這種方式有個優秀代表 - scrcpy, 是genymobile開源的利用ADB工具實現畫面投屏的項目:
- 打開手機的usb 調試即可投屏
- 可達到60fps 的鏡像幀率
- 35-70ms 的低延時
- 可在電腦反向控制手機
使用 USBAccessory 鏡像投屏
此方式的技術實現和adb 完全不一樣, 主要基於 Android USBAccessory , 在兩個設備間建立usb 傳輸通道, 手機端運行app 錄屏傳輸數據至電腦
展望
投屏技術極大改進了設備互聯互通, 華爲和蘋果都在此領域發力, 未來肯定會有更長遠的發展.
我們團隊深耕投屏領域, 不僅實現了miracast 和airplay 無線投屏, 目前也完美實現了 iOS和android 的有線投屏.
分享本文的技術資料, 只爲了讓有興趣的人深入研究 , 實現低延時, 高可用, 秒級設備發現的投屏技術, 提升每個人的數字生活體驗.