绕远路来实现屏幕共享。索尼(Sony)逐步锁定了 PlayStation 5(PS5)硬件的可操作功能。串流便是例子:主机提供便捷的广播(Broadcast)按钮,但想用索尼支持的那少数服务之外的功能就立刻变得麻烦。第三方蓝牙设备同样如此,索尼将无线协议栈限制在本家配件,致其他品牌耳机或手柄无法配对。
正文
Sony 对 PS5 硬件的限制越来越严。串流就是个典型例子:主机给了你一个方便的「Broadcast」按钮,可一旦你想用 Sony 支持的那几个服务之外的东西,立刻就会变得很麻烦。
第三方蓝牙设备也一样。Sony 把无线协议栈锁在自家外设上,其他品牌的耳机或手柄根本连不上 :/
问题
我经常和朋友在 Discord 上一起玩游戏,他们会看我玩,但 PS5 不支持向 Discord 共享屏幕。最直接的方案是采集卡:把 HDMI 输出接到采集卡,再导入 Mac 上的 OBS 推流。但像样的采集卡不便宜,我不想只为这个花上百美元。
Remote Play
Remote Play 算是个可行的办法。我可以把 PS5 连到 MacBook,把 Mac 屏幕共享到 Discord,然后从那里玩。
问题是所有东西都得连到 Remote Play 设备上:手柄、耳机等等。我还偶尔遇到输入延迟,而且画质完全由 PS5 控制,几乎没法配置。我不想每次想串流都要改一遍物理连接。
PS5 串流是如何工作的
如果你登录了 YouTube 或 Twitch 账号,PS5 默认支持向这两个平台推流。使用的协议是 RTMP,即实时消息传输协议,常用于直播音视频流。
开始广播时,PS5 大致会做这些事。
那如果我们让自己的设备冒充 Twitch,接收这条 RTMP 流呢?这就是思路。PS5 并没有把 Twitch 的 IP 写死,而是每次通过 DNS 查询。控制 DNS 返回什么,就控制了流的去向。
找到正确的主机名
最先想到的是直接伪造 ingest.twitch.tv。按下广播时 PS5 解析的就是这个主机名,把它指向 Mac 应该就行了吧?
并不行。ingest.twitch.tv:443 其实是个发现端点,不是 RTMP 服务器本身。PS5 会向它发一个 HTTPS 请求,问「我该用哪个区域 ingest 服务器?」,Twitch 返回类似 ap-southeast-1.prod.fi.contribute.live-video.net 的地址,PS5 再把真正的流推过去。
伪造那个主机名又遇到另一个问题:真正的 Twitch ingest 用的是 RTMPS,即端口 443 上的 RTMP over TLS,而 PS5 会校验证书是否来自受信任的 CA。自签名证书不行,PS5 上也没法安装自定义 CA。
于是我试着用 YouTube 绕过。它的 RTMP ingest 用的是 1935 端口上的明文 RTMP,没有 TLS 证书问题。PS5 很顺利地把流发到了我的 Mac,说明基本思路可行。
但 PS5 会定期查询 YouTube 的 API,确认直播确实在进行。由于 YouTube 从没收到流,检查失败,大约 60 秒后广播就停了。
这意味着我需要找一个使用明文 RTMP 的 Twitch 端点。答案来自直播时观察 DNS 日志:
``` sudo tail -f /tmp/dnsmasq.log
Sep 22 23:20:28 dnsmasq: query[A] ingest.global-contribute.live-video.net from 192.168.8.171
Sep 22 23:20:28 dnsmasq: reply aps30.contribute.live-video.net is 35.55.13.0
```
PS5 在解析 ingest.global-contribute.live-video.net,它最终指向 aps30.contribute.live-video.net。那才是真正的 RTMP 服务器。伪造 contribute.live-video.net 就能覆盖所有子域,把实际的流转到 Mac,而且没有证书问题。
DNS 技巧
这套方案有两个主要部分:dnsmasq 和 nginx-rtmp。我写了个小的 macOS 菜单栏应用,把两者打包并管理起来。
我在 Mac 上运行 dnsmasq,把 Twitch 的 ingest 域名解析到 Mac 的局域网地址:
``` server=1.1.1.1 server=8.8.8.8
Redirect Twitch ingest traffic to the Mac
address=/contribute.live-video.net/192.168.8.175 address=/ingest.global-contribute.live-video.net/192.168.8.175 address=/live.twitch.tv/192.168.8.175 address=/live-sin.twitch.tv/192.168.8.175 address=/live-nrt.twitch.tv/192.168.8.175 address=/live-syd.twitch.tv/192.168.8.175 address=/live-fra.twitch.tv/192.168.8.175 address=/live-ams.twitch.tv/192.168.8.175 address=/live-lhr.twitch.tv/192.168.8.175 address=/live-jfk.twitch.tv/192.168.8.175 address=/live-lax.twitch.tv/192.168.8.175 address=/live-sea.twitch.tv/192.168.8.175
log-queries log-facility=/tmp/dnsmasq.log
no-hosts listen-address=0.0.0.0 ```
192.168.8.175 是我 Mac 的 IP。当 PS5 向 DNS 查询这些 Twitch 端点时,dnsmasq 返回的是我 Mac 的 IP。PS5 以为自己连的是 Twitch,实际连到了我的 Mac。
最后一步是让 PS5 用这台 DNS 服务器。我的 GL.iNet 路由器刷了 OpenWRT,所以我把 PS5 的 DHCP 租约单独配置成下发 Mac 的 IP 作为 DNS:
```
SSH into the router and run:
uci addlist dhcp.lan.dhcpoption="tag:PS5,6,192.168.8.175" uci commit dhcp /etc/init.d/dnsmasq restart ```
tag:PS5 能生效,是因为 PS5 的静态租约已经在 /etc/config/dhcp 里设置了这个标签。选项 6 就是 DHCP 里指定 DNS 服务器的选项。PS5 下次续租时就会采用,主机上完全不需要手动配置 DNS。
接收串流
接收端我用的是 nginx-rtmp:
``` worker_processes 1;
error_log /tmp/nginx-error.log warn; pid /tmp/nginx.pid;
events { worker_connections 512; }
rtmp { server { listen 1935; chunksize 4096; application ps5 { live on; record off; sync 10ms; # Notify our app when a stream starts onpublish http://127.0.0.1:9988/on_publish; } } }
http { server { listen 8080; location /stat { rtmp_stat all; } } } ```
on_publish 回调是菜单栏应用检测 PS5 何时开始广播的方式。nginx 会向 localhost:9988 发一个带流名称的 POST,应用随即给出完整的 RTMP URL,方便复制。
到这一步,PS5 已经把流(1080p60、H.264、AAC 立体声)直接推到我的 Mac,而不是 Twitch。接下来我可以把它导入任何东西:用 OBS 二次推流、本地录制,或者直接播放。
观看
我没有走 OBS,而是用 mpv 拉流,再把窗口共享到 Discord。低延迟配置让延迟保持在一秒以内:
mpv --profile=low-latency --audio-buffer=0.3 rtmp://127.0.0.1/ps5/stream-key
出乎意料地稳定。我已经用了几个星期,没遇到什么问题。完整源码在这里。
下次见!👋
评论
多数人对索尼再次留下完全未加密的流量表示安全担忧,少数人认为根源在 RTMP 协议和 Twitch 而非主机本身,同时有人讽刺官方不开放自定义推流地址。
认为流量完全未加密是索尼的安全疏忽
- 指出索尼再次出现加密错误,传输流量明文暴露,且底层音视频协议复杂可能隐藏大量漏洞,存在被情报机构利用来接管主机和窃取凭据的风险(较多人) > 都2026年了数据还在公网明文传输,RTMP协议不简单,三大机构恐怕能借此接管PS5和凭证(@londons_explore)
认为安全隐患主要源于 RTMP 协议与 Twitch 而非 PS5
- 分析技术原理指出 PS5 通过 DNS 解析推流地址,主服务器有 TLS 保护无法伪造,作者仅伪造了最终接收 RTMP 的服务器,因此这更像是推流协议或平台安全设计问题(少数人) > 这更像是 RTMP 协议或 Twitch 安全的问题,而不是 PS5 本身的缺陷(@tvbusy)
讽刺官方不开放自定义推流目的地
- 调侃如果官方直接允许用户指定自己的 RTMP 服务器地址,许多逆向与伪造折腾就毫无必要,但在当前封闭生态下这显得像天方夜谭(少数人) > 想想看,要是他们允许你指定自己的 RTMP 目的地,这想法太疯狂了(@rezonant)
质疑破解逻辑链条中存在断层
- 有读者指出从“找出真实主机名”到“确保流能出现在 YouTube”之间的技术推导存在未解释的跳跃,怀疑步骤遗漏(少数人) > 我可能漏看了什么,但“弄清真实主机名”和“不用担心流不上传 YouTube”之间似乎有断层(@mixdup)
建议直接用 PC 避开主机生态限制
- 认为 PS5 独占游戏极少,推荐直接购买游戏 PC 并安装 Steam,体验流畅且不艰苦,以此用消费选择投票(少数人) > PS5 只有大概 15 个独占游戏,不如装 Steam 用 PC 省心(@PaulHoule)
有价值的补充
- 可将原方案中的 nginx 与 mpv 步骤合并,直接使用 obs 搭配 gstreamer 或单纯用 gstreamer 实现更精简的流处理(技术补充)
- 有硬核用户选择直接使用开发板的 HDMI 输入端口捕获画面,绕开了 PS5 软件层面的限制,代表了动手派绕道的社区情绪(玩笑式实践)