HN 日本語サマリー

← 一覧へ戻る
Web開発

PS5のRTMPストリームをハイジャックする

Hijacking the PS5's RTMP stream (yashgarg.dev)

294 pointsby ibobev92 コメント

要約

この記事では、PlayStation 5 (PS5) の標準的なストリーミング機能の制限を回避し、カスタム設定でゲームプレイをストリーミングする方法について解説しています。具体的には、PS5がYouTubeやTwitchにストリーミングする際に使用するRTMPプロトコルに着目し、DNS設定を操作してストリームをローカルのMacにリダイレクトする技術的な手法を紹介しています。

全文翻訳

目次 1.問題 2.リモートプレイ 3.PS5のストリーミングの仕組み 4.適切なホスト名の特定 5.DNSトリック 6.ストリームの受信 7.視聴 Sonyは、PS5のハードウェアでできることを徐々に制限してきました。ストリーミングはその良い例です。コンソールには便利な「ブロードキャスト」ボタンがありますが、Sonyがサポートする数少ないサービス以外のことをしようとすると、すぐに面倒になります。サードパーティのBluetoothデバイスも同様です。Sonyはワイヤレススタックを自社製周辺機器にロックしているため、他のブランドのヘッドフォンやコントローラーはペアリングできません。 # 問題 友達とDiscordでゲームをストリーミングして見てもらうことが多いのですが、PS5はDiscordへの画面共有をサポートしていません。明らかな解決策はキャプチャカードです。HDMI出力をキャプチャカードに接続し、Mac上のOBSにフィードして、そこからストリーミングします。しかし、まともなものは安くなく、これのためだけに100ドル以上を費やしたくありませんでした。 # リモートプレイ リモートプレイは私にはある程度機能しました。PS5をMacBookに接続し、Macの画面をDiscordに共有してそこからプレイできました。問題は、コントローラー、イヤホンなどをすべてリモートプレイデバイスに接続する必要があることです。また、時折入力遅延に遭遇し、ストリーム品質はPS5によって完全に制御されます。実際には何も設定できません。ストリーミングしたいたびに物理的なセットアップを変更したくありませんでした。 # PS5のストリーミングの仕組み PS5は、それらのアカウントにサインインしていれば、デフォルトでYouTubeとTwitchへのストリーミングをサポートしています。これに使用されるプロトコルはRTMP(Real-Time Messaging Protocol)で、ライブオーディオ/ビデオストリーミングに一般的に使用されます。したがって、ブロードキャストを開始すると、PS5はほぼ次のように動作します。 もし、自分たちのデバイスをTwitchのように機能させて、そのRTMPストリームを受け取ることができたらどうでしょうか?それがアイデアです。PS5はTwitchのIPをハードコードしているわけではなく、毎回DNSで検索します。DNSが返すものを制御できれば、ストリームの送信先を制御できます。 # 適切なホスト名の特定 最初の試みは、ingest.twitch.tvを直接スプーフィングすることでした。これは、ブロードキャストを押したときにPS5が解決するホスト名なので、Macを指せば機能するはずですよね?そうではありません。ingest.twitch.tv:443は実際にはディスカバリーエンドポイントであり、RTMPサーバー自体ではありません。PS5はそれにHTTPSコールを行い、「どのリージョンのインジェストサーバーを使用すべきか?」と尋ねます。そしてTwitchはap-southeast-1.prod.fi.contribute.live-video.netのようなもので応答します。その後、PS5は実際のストリームをそこにプッシュします。そのホスト名をスプーフィングしたところ、別の問題に遭遇しました。実際のTwitchインジェストはRTMPS(ポート443上のTLS経由のRTMP)を使用しており、PS5は証明書を信頼されたCAに対して検証します。自己署名証明書は機能せず、PS5にカスタムCAをインストールする方法はありません。 次に、回避策としてYouTubeを試しました。そのRTMPインジェストはポート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トリック セットアップには主に2つの部分があります。dnsmasqとnginx-rtmpです。私は両方をバンドルし、管理する小さなmacOSメニューバーアプリを構築しました。Mac上でdnsmasqを実行し、TwitchのインジェストドメインをMacのLANアドレスに解決するように設定します。 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がこれらのTwitchエンドポイントのいずれかをDNSに問い合わせると、dnsmasqは私のMacのIPを返します。PS5はTwitchだと思って私のMacに接続します。 最後のピースは、PS5をこのDNSサーバーに向けることです。私はOpenWRTを実行しているGL.iNetルーターを持っており、PS5のDHCPリース専用にMacのIPをDNSサーバーとして渡すように設定しました。 ルーターにSSHで接続し、次を実行します。 uci add_list dhcp.lan.dhcp_option="tag:PS5,6,192.168.8.175" uci commit dhcp /etc/init.d/dnsmasq restart tag:PS5の部分は、PS5の静的リースがすでに/etc/config/dhcpにそのタグを設定しているため機能します。オプション6はDNSサーバーのDHCPオプションです。PS5は次のDHCP更新時にこれを受け取ります。コンソールで手動で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; 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; } } } http { server { listen 8080; location /stat { rtmp_stat all; } } } on_publishコールバックは、メニューバーアプリがPS5のブロードキャスト開始を検出する方法です。nginxはストリーム名とともにlocalhost:9988にPOSTを送信し、アプリはコピー準備のできた完全なRTMP URLを表示します。この時点で、PS5はストリーム(1080p60、H.264、AACステレオ)をTwitchではなく直接私のMacにプッシュしています。ここから、OBSにプルして再ストリーミングしたり、ローカルに録画したり、直接再生したりできます。 # 視聴 OBSを経由する代わりに、mpvを使用してストリームをプルし、ウィンドウをDiscordに共有しました。低遅延プロファイルは、遅延を1秒未満に保ちます。 mpv --profile=low-latency --audio-buffer=0.3 rtmp://127.0.0.1/ps5/stream-key これは驚くほど信頼性が高いです。数週間使用していますが、問題はありませんでした。完全なソースコードはここにあります。次回まで!👋