驗收單 · 2026-10-22 · 约 10 分钟

PSPlay 遠端串流的技術底層:延遲、協議與虛擬手把的設計取捨

軟體PSPlay分類系统工具
版本9.0.0體積45.57M
開發方PlayStation Mobile Inc.狀態已歸檔
PSPlay 遠端串流的技術底層:延遲、協議與虛擬手把的設計取捨

PSPlay 是什麼、能幹嘛、適合誰

如果你手上有一台 PlayStation 主機(PS4 或 PS5),但房間裡同時只有一台電視,那 PSPlay 基本上就是為你這種人設計的。它把主機的畫面和聲音即時串流到手機或平板上,並把你在觸控螢幕上的按壓、搖桿拖動、甚至外接手把的輸入反向送回主機——整個回路做到「看見畫面 → 按下按鈕 → 遊戲裡角色反應」幾乎同步。

這件事看似簡單:不就是影像傳輸加遙控嗎?但如果你拆開來看,會發現它同時踩在即時視訊、低延遲網路、觸控事件映射、多平台手把相容這四個本來就很難的領域上。而 PSPlay 最有意思的地方正在於——它選擇了一條和官方 Remote Play 完全不同的路:官方 Remote Play 是用 UDP + 自研協議封裝後送到官方伺服器再轉發,PSPlay 則把所有邏輯都在本地設備上跑完,不走任何索尼的伺服器中轉。

這條路的代價是什麼、又是怎麼做到低延遲的?這篇我會從協議、編碼、虛擬手把三個層面拆解。

安裝

PSPlay下載 只有 Android APK 一個發行渠道,最新版本 9.0.0、安裝包 45.57M,屬於體積中等偏大的應用——主要是因為它內建了多個硬體解碼器(手機廠商的 SoC 解碼驅動無法共用,PSPlay 必須把 Android H.264/H.265 的硬加速層直接打包進來)。

安裝本身不複雜:下載完 APK、允許「安裝未知來源應用」就可以點安裝。但有兩件事要提前準備好——第一是主機端的設定,第二是手機上的網路狀態。主機端(PS5 或 PS4)必須先進「設定 → 系統 → 遠端遊玩」打開遠端連線功能、設定好裝置註冊密碼或直接用 PSN 帳號配對;手機端最乾淨的做法是直接連同路由器同一個 5GHz Wi-Fi(2.4GHz 的干擾會讓延遲抖動明顯增大)。如果你打算用行動網路在外串,還要確認家裡路由器的 NAT 類型——這個我在後面的協議段落會講到為什麼。

安裝完第一次開啟時,PSPlay 會引導你輸入主機的 IP 或用 PSN 掃碼註冊、選取預設的虛擬手把佈局、指定影片解析度(720p / 1080p / 2160p 四檔)。如果手機解碼硬體夠強,建議直接 1080p——這個設定從頭到尾影響最大。

為什麼 PSPlay 能把延遲壓得夠低?三層架構拆解

我把 PSPlay 的技術路線拆成三層來做架構解析:主機端即時編碼、UDP 即時傳輸、手機端即時解碼 + 觸控事件反向映射。每一層的取捨都直接影響你最終感受到的「按下按鈕到角色動作」的延遲。

第一層:主機端的 H.264/H.265 即時編碼

PS5 主機本身內建了一顆專門用於遠端串流的硬體編碼器——這是索尼為 Remote Play 專門設計的 SoC 模組,不和一般遊戲的影像輸出共用。主機把遊戲畫面以幀為單位餵給編碼器,編碼器輸出每幀獨立的 H.264 或 H.265 壓縮資料,然後直接丟進 UDP 封包發出去。

重點是「每幀獨立」——它不是電影常用的長 GOP(Group of Pictures)壓縮(電影常用前後幀參照來省碼率,但參照幀遺失就整組報廢),而是用短 GOP 甚至全 I 幀壓縮。代價是碼率更高(同等畫質下比電影串流大 2 到 3 倍),但好處是任何一個封包丟失都只影響當前這一幀,不會讓後續十幾幀一起花掉——這對於遊戲這種即時場景來說,短暫卡一下(幾十毫秒)遠比畫面變綠或一直卡在某個畫面好太多。

第二層:UDP 即時傳輸,為什麼不是 TCP?

這是最核心的取捨。TCP 保證所有封包按序到達、丟了就重傳——但重傳的等待時間對遊戲來說是致命的。假設 RTT(Round-Trip Time,往返延遲)是 30ms,丟一個封包重傳就要再等至少一個 RTT;如果網路抖動,重傳多個封包,延遲輕飄飄就能衝破 200ms——這時你按下按鈕,角色半秒後才動,已經沒法玩機了。

UDP 不保證到達、不保證順序,但延遲有下界——沒有重傳等待,封包到就解碼,不到就跳過(或用上一幀頂著)。PSPlay 在 UDP 之上自己封了一層很薄的協議:每幀帶一個序號,手機端用序號判斷當前收到的是不是最新一幀、有沒有跳幀;如果跳了好幾幀,就直接請主機端插一個全 I 幀補齊——整個過程不需要 TCP 三次握手、不需要擁堵控制、沒有任何冗餘的確認封包。

但 UDP 也有代價——就是 NAT 類型問題。如果你家寬頻在運營商的 CGNAT(運營商級 NAT)後面,手機在外網的 UDP 封包根本找不到你家的主機。這也是為什麼很多人反應「PSPlay 在同網路能用、一換行動網路就連不上」。解決方案要嘛找運營商要公網 IP(讓主機有 NAT Type 2)、要嘛在路由器上跑 ZeroTier / Tailscale 把兩端拉進同一個虛擬區網。

第三層:手機端硬體解碼 + 虛擬觸控映射

主機端每秒 30 或 60 幀的 H.264/H.265 串流,到了手機這一端怎麼處理?

PSPlay 走的是硬體解碼路徑——直接調用 Android NDK 裡的 MediaCodec 介面,把手機 SoC 上的硬體解碼器(Qualcomm 的 Adreno、联发科的 Mali、三星的 Xclipse)拿出來用。這件事很重要:軟體解碼(CPU 跑)會把一顆 8 Gen 2 拖到 60% 佔用、還要 50ms 以上延遲;硬體解碼只佔用解碼專用核心,做過資源監控的玩家應該懂這個數字意味著什麼,延遲通常在 5ms 以內、CPU 佔用不到 10%。PSPlay 為什麼把解碼驅動直接打包進 APK?就是為了繞開手機廠商對 MediaCodec 的二次封裝和可能的閹割——很多安卓旗艦機出廠時會把解碼器的部分優先級關掉,PSPlay 直接把那個位元翻過來。

解碼完的畫面再往 Android 的 SurfaceView 上丟,這裡還有一個小技巧——如果你有 Root,PSPlay 會允許你勾一個「跳過 SurfaceFlinger」的選項。SurfaceFlinger 是 Android 系統的顯示合成器,它會把所有應用的畫面、狀態列、導航列合成後再送顯示器。多了一層合成就多了 5 到 15ms 延遲——對遊戲來說就是半幀。跳過它之後,解碼器的輸出直接送顯示硬體,這在競技類遊戲裡差異非常明顯。

最後是虛擬觸控事件的反向映射。你在螢幕上拖動左搖桿、按下 ○ 鍵,手機怎麼把這些動作變成主機認得的按鈕訊號?PSPlay 在本地維護一份「虛擬手把狀態表」——每當你觸控螢幕,應用就即時更新這張表,然後把這張表以 60Hz 的頻率打包成 UDP 封包送回主機。主機端收到後,直接把這份狀態表注入到 PlayStation 的 HID 輸入層——對主機來說,這跟你插了一根 USB DualSense 沒什麼區別。

這也是為什麼 PSPlay 的虛擬手把可以完全自訂:它不是「一個固定畫面疊在遊戲上」,而是「獨立於遊戲畫面之上的觸控捕捉層」——你拖動螢幕上任何位置、任何大小的按鈕,觸控事件都直接送進那份狀態表、不經過遊戲本身。佈局編輯器能做拖拽、縮放、旋轉、透明度調整,底層就是改觸控捕捉層的熱區座標和半透明疊加層的顯示參數,跟主機端完全無關。

PSPlay 自訂虛擬手把佈局的編輯界面

深度原理解析的設計取捨與邊界

講到這裡,PSPlay 的設計哲學已經很清晰了:盡量把所有邏輯往兩端推,中間的網路通道越薄越好。主機端盡量用硬體、盡量短 GOP;手機端盡量硬解碼、盡量跳過系統層;中間只留一層薄到極致的 UDP 封裝。

這套設計的優點就是速度——同網路下延遲輕鬆能壓進 30ms 以內,而官方 Remote Play 走伺服器中轉通常要 80 到 120ms。代價是什麼呢?第一是 NAT 類型依賴嚴重,官方 Remote Play 有索尼的伺服器當中轉不怕 NAT Type 3,PSPlay 就得用戶自己想辦法。第二是功能閹割,官方 Remote Play 支援觸控板觸控、六軸感應器、手把震動回饋、甚至觸控筆,PSPlay 目前只實作了按鈕和搖桿的狀態映射——震動回饋要靠手機本身的震動馬達模擬、六軸感應器完全沒有。第三是安全,官方 Remote Play 有端到端加密、裝置註冊綁定、PSN 雙因素驗證;PSPlay 雖然也有加密(TLS 握手後換 AES 金鑰),但它不參與索尼的任何認證流程,註冊裝置的密碼存在本地。

用我自己造的一個生活化類比來收尾:你可以把 PSPlay 想像成「你家到朋友家開了一條單線道的貨車道」,而官方 Remote Play 是「貨物先拉到中央物流中心、再從中心分發到朋友家」。單線道的好處是快、沒有中間轉運;壞處是單線道兩頭都得自己打通(NAT 問題)、只能走貨(影像和按鈕狀態)不能走人(震動、觸控板、六軸這些複雜輸入)。物流中心那條路慢但什麼都能送、不用你操心路權問題——取捨就在於:你要的是「能玩」(官方 Remote Play)還是「玩起來像在主機前一樣」(PSPlay)。

本文為個人基於網路公開資料整理編寫,非官方內容,僅供學習交流參考;軟體版權歸原作者所有,請支持正版;使用過程中遇到問題請查閱官方管道,本文不承擔任何責任。

同類驗收報告