安卓Android/蘋果iOS 有線投屏原理和實現

有線鏡像投屏簡介

手機投屏到電腦分爲無線和有線兩種方式
無線通過WiFi投屏,基本能實現高清,但是受限於網絡速度, 延遲會比較高, 不適合玩遊戲這種使用場景.
有線投屏 通過usb數據線能實現設備間穩定的連接, 可以高速傳輸數據, 延遲低, 畫面清晰, 適合遊戲, 直播等場景

iOS 有線鏡像投屏原理

MAC系統自帶的 QuickTime Player 在插入Lighting 數據線時, 能實現iOS 屏幕鏡像和錄製, 如圖所示:

可以此爲基礎研究有線投屏的協議, 根據抓包並分析, 可以初步得到協議實現, 分成3個步驟:

1. 啓動投屏
  1. 啓用隱藏設備配置
  2. 聲明結束端點
  3. 等待接收 PING 數據包
  4. 使用 PING 數據包進行響應
  5. 等待 SYNC CWPA 數據包接收設備音頻時鐘的時鐘
  6. 創建本地時鐘,將時鐘ref作爲回覆SYNC CWPA併發送
  7. 發送ASYN_HPD1
  8. 發送ASYN_HPA1與步驟 6 中收到的設備音頻時鐘
  9. 接收 SYNC AFMT,並回復零錯誤代碼
  10. 使用設備視頻時鐘Ref接收 SYNC CVRP
  11. 使用本地視頻時鐘Ref進行回覆
  12. 使用設備的視頻時鐘Ref開始發送 ASYN 需求
  13. 接收兩個 ASYN 集屬性
  14. 接收同步 Clok,並回復新創建的時鐘
  15. 接收兩個 SYNC 時間,並回復兩個 CMTimes
2. 接收數據

視頻和音頻的數據包將由設備發送。我們需要定期發送視頻的 NEED 數據包

3. 關閉投屏
  1. 從 cwpa 同步數據包發送帶有設備時鐘ref 的 asyn hpa0,告訴設備停止發送音頻
  2. 發送 hpd0 與空時鐘Ref 停止視頻
  3. 接收同步停止包,我們創建的視頻時鐘時,cvrp發送給我們,這是在每個饋送數據包
  4. 回覆以 8 個零字節同步停止
  5. 接收本地視頻時鐘Ref的 ASYN RELS(在 FEED 數據包中找到的 ASYN RELS)
  6. 接收 SYNC CLOCK 後創建的本地時鐘的 ASYN RELS
  7. 釋放 usb 終結點
  8. 將設備活動配置設置爲僅 usbmux

具體的鏡像協議細節點擊訪問 quicktime_video_hack , 包括一個go 語言的協議實現, 可以運行在Ubuntu 和 MacOS 平臺.

Android 有線鏡像投屏原理

Android系統的有線投屏有2種實現方式, 使用ADB 和 USBAccessory 方式. 缺點是, 不管哪種方式, 目前都不能投屏系統聲音.

使用 ADB 鏡像投屏

這種方式有個優秀代表 - scrcpy, 是genymobile開源的利用ADB工具實現畫面投屏的項目:

  1. 打開手機的usb 調試即可投屏
  2. 可達到60fps 的鏡像幀率
  3. 35-70ms 的低延時
  4. 可在電腦反向控制手機
使用 USBAccessory 鏡像投屏

此方式的技術實現和adb 完全不一樣, 主要基於 Android USBAccessory , 在兩個設備間建立usb 傳輸通道, 手機端運行app 錄屏傳輸數據至電腦

展望

投屏技術極大改進了設備互聯互通, 華爲和蘋果都在此領域發力, 未來肯定會有更長遠的發展.
我們團隊深耕投屏領域, 不僅實現了miracast 和airplay 無線投屏, 目前也完美實現了 iOS和android 的有線投屏.
分享本文的技術資料, 只爲了讓有興趣的人深入研究 , 實現低延時, 高可用, 秒級設備發現的投屏技術, 提升每個人的數字生活體驗.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章