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