家用游戏机的直播功能是一个单向通道:按下 Broadcast 按钮,画面被推给索尼指定的几个平台,其他去处一概不通。9 月 28 日,工程师 Yash Garg 发表的一篇文章把这条通道反了过来:让 PS5 把直播流推到一台 Mac 上,Twitch 全程不知情。整套方案只依赖两个brew 就能装上的开源组件,源码放在 GitHub 仓库 yash-garg/PS5Streamer 里。

要解决的问题:采集卡之外的第二条路
作者的需求在主机玩家中相当常见:和朋友在 Discord 上连线时分享自己的游戏画面。PS5 的 HDMI 输出接一张采集卡、再进 OBS,是最标准的做法,但一张像样的采集卡价格在 100 美元上下。索尼的 Remote Play 是免采集卡的替代品,它把画面串到 Mac 上再共享屏幕,代价是手柄、耳机都必须连到 Remote Play 设备上,而且串流质量完全由 PS5 单方面决定,没有任何可调参数,输入延迟也时有波动。这篇博客的出发点就是绕开这两条路,找到第三个入口。
第一层认知修正:Twitch 的 ingest 地址不在于明面上
PS5 原生支持向 YouTube 和 Twitch 直播,走的是 RTMP(Real-Time Messaging Protocol,实时消息协议),这是直播行业沿用多年的推流协议。作者最初的假设很自然:PS5 推流的目标是 ingest.twitch.tv,那把这个域名劫持到自己的机器,流不就进来了。
第一次尝试就这样失败了。ingest.twitch.tv:443 承担的角色出人意料:它只是一个发现端点(discovery endpoint),PS5 向它发起 HTTPS 请求,询问「该用哪个区域的服务器收流」,Twitch 返回类似 ap-southeast-1.prod.fi.contribute.live-video.net 的区域地址,之后 PS5 才把流推往那个地址。
顺藤摸瓜去劫持区域地址,撞上的是第二堵墙。Twitch 的真实 ingest 走 RTMPS,也就是套了 TLS 的 RTMP,跑在 443 端口上。PS5 会按系统内置的受信任 CA 列表校验服务器证书,自签名证书直接被拒,而 PS5 又没有任何安装自定义根证书的途径。中间人方案在协议层面被焊死。
YouTube 那边是另一种死法。YouTube 的 ingest 恰好用明文 RTMP、1935 端口,没有 TLS,流确实进来了;但 PS5 每隔一段时间会调用 YouTube 的 API 确认直播仍在进行,被劫持后 YouTube 从未见到这场直播,API 查无此流,约 60 秒后 PS5 主动掐断直播。
破案点:DNS 日志里的真名字
前两条路都走不通之后,作者换了个做法:不猜 PS5 在和谁通信,直接看它的 DNS 查询记录。播报开始的同时盯着 dnsmasq 日志:
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 上,而且整个过程不涉及证书问题,因为 PS5 对这台「假 Twitch」发出的 RTMPS 握手根本不会发生:劫持后 PS5 推流的目标就是 Mac 本机的 nginx-rtmp,作者实测 1080p60、H.264 编码、AAC 立体声的流原样落地。
这个排查过程是整篇文章最有含金量的部分。明面上的 ingest.twitch.tv 是给文档和直觉准备的入口,实际链路藏在 DNS 查询里。对任何「官方客户端到底在和谁通信」类的问题,日志先于猜测,这个方法论比结论本身更可迁移。
实现拆解:两个组件各干一件事
整套系统由 dnsmasq 和 nginx-rtmp 两个开源组件组成,作者把它们的编排做成了一个 macOS 菜单栏应用(Swift 编写,仓库 yash-garg/PS5Streamer)。
dnsmasq 负责撒谎。 它作为局域网内的 DNS 服务器运行,配置里把 Twitch 的 ingest 域名全部指向 Mac 自己的局域网 IP:
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-fra.twitch.tv/192.168.8.175
address=/live-jfk.twitch.tv/192.168.8.175
address=/live-lax.twitch.tv/192.168.8.175
log-queries
log-facility=/tmp/dnsmasq.log
no-hosts
listen-address=0.0.0.0address=/域名/IP 语法会把该域名及全部子域名解析到指定 IP。列表里 live-sin(新加坡)、live-nrt(东京)、live-fra(法兰克福)这些区域入口全部覆盖,PS5 无论被分配到哪个区域服务器,解析结果都是同一台 Mac。
让 PS5 用上这个 DNS 有两种姿势。 手动方式是在 PS5 的 设置 → 网络 → 高级 里把 DNS 改成 Mac 的 IP,辅 DNS 填 1.1.1.1 兜底。作者用的是更自动的方式:他的 GL.iNet 路由器跑着 OpenWRT,按 PS5 的 DHCP 租约打上 tag,定向下发 DNS 服务器地址:
# SSH into the router and run:
uci add_list dhcp.lan.dhcp_option="tag:PS5,6,192.168.8.175"
uci commit dhcp
/etc/init.d/dnsmasq restartDHCP option 6 就是要下发的 DNS 服务器字段。PS5 在下一次租约更新时自动拿到新 DNS,主机上零操作。这个 tag 机制值得留意:它是按设备下发网络配置的标准做法,家里有多个设备需要不同 DNS 策略时同样适用。
nginx-rtmp 负责收流。 编译了 RTMP 模块的 nginx 监听 1935 端口(RTMP 协议默认端口),把 PS5 推来的流作为直播应用接收:
rtmp {
server {
listen 1935;
chunk_size 4096;
application ps5 {
live on;
record off;
sync 10ms;
# Notify our app when a stream starts
on_publish http://127.0.0.1:9988/on_publish;
}
}
}on_publish 是点睛之笔。直播流开始发布的瞬间,nginx 会向这个地址发一个 POST 回调,菜单栏应用里一个监听 9988 端口的 NWListener(Swift Network 框架的 TCP 监听器)收到回调,从请求体里解析出流名称,随即把完整的本地推流地址 rtmp://127.0.0.1/ps5/流名称 直接呈现在菜单栏里。用户不需要去翻日志找地址,复制粘贴进 OBS 就能用。
落地效果与边界
收流的最后一步是用 mpv 拉流:
mpv --profile=low-latency --audio-buffer=0.3 rtmp://127.0.0.1/ps5/stream-key--profile=low-latency 加 0.3 秒音频缓冲,实测延迟在 1 秒以内,共享 mpv 窗口给 Discord 即可。作者已经这样用了几周,没有出现稳定性问题。流进本地之后去处就自由了:OBS 转推、本地录制、直接观看都行。nginx 配置里保留的 push 指令甚至可以把流同时转推回 Twitch、X 或 YouTube,等于把 PS5 单平台的直播出口变成了多平台分发节点。
方案的适用范围也要交代清楚。DNS 劫持只在局域网内成立,PS5 和 Mac 必须在同一网络;Twitch 账号仍需登录 PS5,因为 Broadcast 界面本身要账号才能解锁;这套打法依赖索尼不更换 ingest 域名策略,父域劫持已经把子域名变化的概率降到很低,但协议层面的变动(比如全面强制证书校验的私有协议)依然能让方案失效。
这个玩法不是孤例
用 DNS 劫持接 PS5 推流并不是这篇文章的发明。GitHub 上能找到一串同类项目:ImLunaHey/playstation-rtmp(2025 年 3 月)、puilp0502/ps5-recast(2023 年 12 月)用的都是同一个原理;2026 年 9 月还有人把同样的套路封装成面向国内平台的转推工具(PS5-Live-Relay,把 Twitch 流转推到直播软件)。同一方法被不同的人在不同年份反复实现,一方面说明需求真实存在(采集卡贵、Remote Play 不顺手),另一方面也说明这个技巧在主机玩家圈子里早已是公开的秘密。Yash Garg 这篇文章的贡献在于把踩坑过程完整写了出来:为什么劫持明面上的域名不行、证书墙在哪里、YouTube 通道为什么 60 秒就断。这些「为什么」恰恰是散落的同类仓库 README 里没有的部分。
对有主机、有 Mac、想直播或录制的玩家,这篇文章提供的是一条零硬件成本的完整路径:brew 装两个组件,改一份 DNS 配置,OBS 里加一个媒体源。全部工具链都是开源的,代码在 yash-garg/PS5Streamer 仓库里可以自己编译。
来源:Hijacking the PS5's RTMP Stream(yashgarg.dev)、yash-garg/PS5Streamer(GitHub)、Lobste.rs 讨论