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


有線鏡像投屏簡介

手機投屏到電腦分為無線和有線兩種方式
無線通過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 的有線投屏.
分享本文的技術資料, 只為了讓有興趣的人深入研究 , 實現低延時, 高可用, 秒級設備發現的投屏技術, 提升每個人的數字生活體驗.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM