Repository navigation
Expand file tree
/
Copy pathindex.html
More file actions
444 lines (418 loc) · 30.6 KB
/
Copy pathindex.html
File metadata and controls
444 lines (418 loc) · 30.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
<!DOCTYPE html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>PSCapture — your PS5 screen as a capture card on PC</title>
<meta name="description" content="PSCapture turns a jailbroken PS5 into a capture card for your PC: the console screen streams over your LAN and shows up in Discord, OBS and ffmpeg as a camera called “PS5 Capture”.">
<meta name="theme-color" content="#07090d">
<link rel="icon" type="image/png" href="pscapture.png">
<link rel="alternate" hreflang="en" href="https://fstat13.github.io/PSCapture/">
<link rel="alternate" hreflang="it" href="https://fstat13.github.io/PSCapture/index.it.html">
<meta property="og:type" content="website">
<meta property="og:title" content="PSCapture — your PS5 screen, live on your PC">
<meta property="og:description" content="The PS5 screen shows up in Discord, OBS and ffmpeg as the camera “PS5 Capture”. No capture card, no Remote Play, no cloud.">
<meta property="og:image" content="https://fstat13.github.io/PSCapture/social-preview.png">
<meta property="og:image:width" content="1280">
<meta property="og:image:height" content="640">
<meta property="og:url" content="https://fstat13.github.io/PSCapture/">
<meta name="twitter:card" content="summary_large_image">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
<link rel="stylesheet" href="style.css">
</head>
<body>
<svg width="0" height="0" style="position:absolute" aria-hidden="true">
<symbol id="i-download" viewBox="0 0 24 24"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></symbol>
<symbol id="i-star" viewBox="0 0 24 24"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></symbol>
<symbol id="i-check" viewBox="0 0 24 24"><polyline points="20 6 9 17 4 12"/></symbol>
<symbol id="i-video" viewBox="0 0 24 24"><path d="m22 8-6 4 6 4V8Z"/><rect x="2" y="6" width="14" height="12" rx="2"/></symbol>
<symbol id="i-zap" viewBox="0 0 24 24"><polygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2"/></symbol>
<symbol id="i-file" viewBox="0 0 24 24"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/></symbol>
<symbol id="i-refresh" viewBox="0 0 24 24"><polyline points="23 4 23 10 17 10"/><polyline points="1 20 1 14 7 14"/><path d="M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15"/></symbol>
<symbol id="i-sliders" viewBox="0 0 24 24"><line x1="4" y1="21" x2="4" y2="14"/><line x1="4" y1="10" x2="4" y2="3"/><line x1="12" y1="21" x2="12" y2="12"/><line x1="12" y1="8" x2="12" y2="3"/><line x1="20" y1="21" x2="20" y2="16"/><line x1="20" y1="12" x2="20" y2="3"/><line x1="1" y1="14" x2="7" y2="14"/><line x1="9" y1="8" x2="15" y2="8"/><line x1="17" y1="16" x2="23" y2="16"/></symbol>
<symbol id="i-lock" viewBox="0 0 24 24"><rect x="3" y="11" width="18" height="11" rx="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/></symbol>
<symbol id="i-console" viewBox="0 0 24 24"><rect x="2" y="6" width="20" height="12" rx="3"/><line x1="6" y1="12" x2="10" y2="12"/><line x1="8" y1="10" x2="8" y2="14"/><circle cx="16" cy="11" r=".6"/><circle cx="18" cy="13" r=".6"/></symbol>
<symbol id="i-monitor" viewBox="0 0 24 24"><rect x="2" y="3" width="20" height="14" rx="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></symbol>
<symbol id="i-info" viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><line x1="12" y1="16" x2="12" y2="12"/><line x1="12" y1="8" x2="12.01" y2="8"/></symbol>
<symbol id="i-alert" viewBox="0 0 24 24"><path d="M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></symbol>
<symbol id="i-search" viewBox="0 0 24 24"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></symbol>
</svg>
<nav class="nav">
<div class="wrap">
<a class="logo" href="#top"><img src="pscapture.png" alt="">PSCapture</a>
<div class="nav-links">
<a href="#how">How it works</a>
<a href="#start">Setup</a>
<a href="#trouble">Troubleshooting</a>
<a href="#build">Build</a>
<a href="#faq">FAQ</a>
</div>
<div class="nav-right">
<a class="lang" href="index.it.html" hreflang="it">Italiano</a>
<a class="btn btn-ghost btn-sm" href="https://github.com/fstat13/PSCapture"><svg class="i"><use href="#i-star"/></svg>Star <span class="stars" data-stars hidden></span></a>
</div>
</div>
</nav>
<header class="hero" id="top">
<div class="wrap hero-grid">
<div>
<span class="eyebrow"><span class="tagv">v0.1</span>Tested on PS5 firmware 13.60</span>
<h1>Your PS5 screen,<br><span class="grad">live on your PC.</span></h1>
<p class="lead">PSCapture turns a jailbroken PlayStation 5 into a capture card.
The console streams its own screen over your LAN, and Windows sees it as a
camera called <b>PS5 Capture</b>, ready for Discord, OBS and ffmpeg.</p>
<div class="cta">
<a class="btn btn-primary" href="https://github.com/fstat13/PSCapture/releases"><svg class="i"><use href="#i-download"/></svg>Download for Windows</a>
<a class="btn btn-ghost" href="https://github.com/fstat13/PSCapture"><svg class="i"><use href="#i-star"/></svg>Star on GitHub <span class="stars" data-stars hidden></span></a>
</div>
<div class="hero-meta">
<span><svg class="i"><use href="#i-check"/></svg>No capture card</span>
<span><svg class="i"><use href="#i-check"/></svg>No Remote Play</span>
<span><svg class="i"><use href="#i-check"/></svg>No cloud</span>
<span><svg class="i"><use href="#i-check"/></svg>One .exe</span>
</div>
</div>
<div class="app" role="img" aria-label="The PSCapture window: the log shows the driver check, the payload being sent and the stream connecting; the status pill reads STREAMING.">
<div class="app-bar">
<img src="pscapture.png" alt="">
<span class="t">PSCapture by fstat13 - PS5 screen to PC</span>
<span class="w"><span>–</span><span>□</span><span>✕</span></span>
</div>
<div class="app-body">
<div class="app-head">
<div class="app-title">PSCapture<small>PS5 screen to PC</small></div>
<span class="pill live"><i></i> STREAMING 29.8 fps</span>
</div>
<div class="app-row">
<span class="app-lbl">PS5 IP</span><span class="app-in">192.168.0.36</span>
<span class="app-btn">Deploy payload</span><span class="app-btn">Install driver</span>
</div>
<div class="app-row">
<span class="app-btn big">START STREAMING</span><span class="app-btn stop">STOP</span>
<span class="app-knobs app-row" style="margin:0">
<span class="app-lbl">gain</span><span class="app-in">1.0</span>
<span class="app-lbl">shift px</span><span class="app-in">0</span>
</span>
</div>
<div class="app-log" aria-hidden="true">
<div>PSCapture pronto: premo Start e faccio tutto da solo.</div>
<div>--- AVVIO AUTOMATICO ---</div>
<div>driver gia' installato</div>
<div>payload dall'eseguibile (175480 byte)</div>
<div>payload 175480 byte, invio a 192.168.0.36</div>
<div>autoloader aggiornato (pldmgr)</div>
<div class="hl">payload avviato - la PS5 deve mostrare la notifica PSCapture</div>
<div>porta stream: 5599</div>
<div class="ok">collegato a 192.168.0.36:5599</div>
</div>
</div>
</div>
</div>
<div class="wrap">
<div class="stats">
<div class="stat"><div class="n">1920×1080</div><div class="l">full HD in OBS</div></div>
<div class="stat"><div class="n">~30 fps</div><div class="l">over a plain LAN</div></div>
<div class="stat"><div class="n">0</div><div class="l">re-encodes on the console</div></div>
<div class="stat"><div class="n">1 file</div><div class="l">driver and payload inside</div></div>
</div>
</div>
</header>
<main class="wrap">
<section id="why" class="reveal">
<div class="sec-head">
<div class="kicker">Why PSCapture</div>
<h2>A capture card, without the capture card.</h2>
<p class="sub">Everything runs on hardware you already own: the console, your network and your PC.</p>
</div>
<div class="grid g3">
<div class="card"><div class="ico"><svg class="i"><use href="#i-video"/></svg></div>
<h3>A real camera device</h3>
<p>A DirectShow source filter named <b>PS5 Capture</b>. Any app that can open a webcam can open your console.</p></div>
<div class="card"><div class="ico v"><svg class="i"><use href="#i-zap"/></svg></div>
<h3>Straight from the display engine</h3>
<p>The payload reads the console's scan-out buffer and sends raw NV12 frames. Nothing is re-encoded, so nothing waits for an encoder.</p></div>
<div class="card"><div class="ico g"><svg class="i"><use href="#i-file"/></svg></div>
<h3>One file, one window</h3>
<p><b>PSCapture.exe</b> installs the driver, sends the payload, registers it in the autoloader and connects, all on its own.</p></div>
<div class="card"><div class="ico a"><svg class="i"><use href="#i-refresh"/></svg></div>
<h3>Recovers by itself</h3>
<p>Console still off? It retries every 2 seconds. Stream dropped? It reconnects. You don't have to babysit it.</p></div>
<div class="card"><div class="ico"><svg class="i"><use href="#i-sliders"/></svg></div>
<h3>Live tuning</h3>
<p>Colour <code>gain</code> and horizontal <code>shift</code> apply in about a second and are saved in <code>pscapture.ini</code>.</p></div>
<div class="card"><div class="ico v"><svg class="i"><use href="#i-lock"/></svg></div>
<h3>Stays on your network</h3>
<p>No accounts, no cloud relay, no Remote Play. Frames go from the console to your PC and nowhere else.</p></div>
</div>
</section>
<section id="how" class="reveal">
<div class="sec-head">
<div class="kicker">How it works</div>
<h2>Three small pieces, one camera.</h2>
<p class="sub">A payload on the console, a feeder and a driver on the PC. The apps you already use just see a webcam.</p>
</div>
<div class="pipe">
<div class="node"><div class="where">PS5</div><h3>Payload</h3>
<p>Reads the display engine's scan-out ring, builds NV12 frames and serves them on TCP <code>5599</code>. Pops the toast <i>“PSCapture is streaming on:5599”</i>.</p></div>
<div class="link"><span>TCP · NV12<br>your LAN</span><div class="line"></div></div>
<div class="node"><div class="where">PC · PSCapture.exe</div><h3>Feeder</h3>
<p>Receives the frames and publishes them into a shared-memory ring.</p></div>
<div class="link"><span>shared<br>memory</span><div class="line"></div></div>
<div class="node"><div class="where">PC · pscapture.dll</div><h3>Driver</h3>
<p>A DirectShow source filter that exposes the ring as the camera <b>PS5 Capture</b>.</p></div>
<div class="link"><span>DirectShow</span><div class="line"></div></div>
<div class="node end"><div class="where">Your apps</div><h3>Any camera app</h3>
<p>Pick <b>PS5 Capture</b> like any webcam.</p>
<div class="chips"><span class="chip">Discord</span><span class="chip">OBS</span><span class="chip">ffmpeg</span></div></div>
</div>
</section>
<section id="requirements" class="reveal">
<div class="sec-head">
<div class="kicker">Before you start</div>
<h2>What you need.</h2>
</div>
<div class="grid g2">
<div class="req">
<div class="req-h"><div class="ico"><svg class="i"><use href="#i-console"/></svg></div><h3>On the PS5</h3></div>
<ul>
<li><svg class="i"><use href="#i-check"/></svg><span>A jailbroken console<small>Built and tuned on firmware <b>13.60</b>. See the FAQ for other versions.</small></span></li>
<li><svg class="i"><use href="#i-check"/></svg><span>Payload loader on TCP <code>9021</code><small><code>elfldr</code>-style, as in every current jailbreak setup.</small></span></li>
<li><svg class="i"><use href="#i-check"/></svg><span>Anonymous FTP on TCP <code>2121</code><small>The app reads and writes a few files on the console.</small></span></li>
<li class="opt"><svg class="i"><use href="#i-check"/></svg><span><code>pldmgr</code> autoloader <span class="tagopt">optional</span><small>Starts the payload on every boot, so you never deploy by hand.</small></span></li>
</ul>
</div>
<div class="req">
<div class="req-h"><div class="ico v"><svg class="i"><use href="#i-monitor"/></svg></div><h3>On the PC</h3></div>
<ul>
<li><svg class="i"><use href="#i-check"/></svg><span>Windows 10 or 11, 64-bit<small>The camera is a DirectShow device, so the PC side is Windows-only.</small></span></li>
<li><svg class="i"><use href="#i-check"/></svg><span>Same network as the console<small>Wired recommended. Gigabit is plenty for 1080p at 30 fps.</small></span></li>
<li><svg class="i"><use href="#i-check"/></svg><span>Admin rights, once<small>To register the camera for every program on the machine.</small></span></li>
<li><svg class="i"><use href="#i-check"/></svg><span><b>PSCapture.exe</b> from <a href="https://github.com/fstat13/PSCapture/releases">Releases</a><small>One single file: the payload and the driver are inside it.</small></span></li>
</ul>
</div>
</div>
</section>
<section id="start" class="reveal">
<div class="sec-head">
<div class="kicker">Setup</div>
<h2>From zero to live in five steps.</h2>
<p class="sub">After step 2 you mostly watch: the app does the rest and tells you what it's doing.</p>
</div>
<ol class="steps">
<li><h3>Jailbreak the console</h3>
<p>Run your usual jailbreak so the payload loader (<code>9021</code>) and FTP (<code>2121</code>) are up.</p></li>
<li><h3>Double-click <code>PSCapture.exe</code></h3>
<p>Windows asks <i>“Do you want to allow this app to make changes to your device?”</i>. Click <b>Yes</b>. The app elevates itself, no right-click needed.</p></li>
<li><h3>Check the IP</h3>
<p>The default is <code>192.168.0.36</code>. If your PS5 has a different address, type it in <b>PS5 IP</b> and press <b>Apply</b>. It's remembered. You can find it on the console under <i>Settings → Network → Connection Status → View Connection Status</i>.</p></li>
<li><h3>Hands off</h3>
<p>On the first run the app installs the driver, then sends the payload and connects. The console shows <i>“PSCapture is streaming on:5599”</i> and the status pill turns <b style="color:var(--green)">green: STREAMING</b>.</p></li>
<li><h3>Pick <b>PS5 Capture</b> in your app</h3>
<p>Discord, OBS or ffmpeg. See <a href="#use">where to find it</a> below.</p></li>
</ol>
<h3 style="margin:30px 0 6px">Reading the log</h3>
<p style="color:var(--dim)">The app's log is in Italian. Here's what each line means, in the order you'll see them.</p>
<div class="term" style="margin-top:14px">
<div class="term-bar"><i></i><i></i><i></i><b>pscapture-app.log</b></div>
<div class="term-row"><code>driver gia' installato</code><span class="m">The camera is already registered. Nothing to do.</span></div>
<div class="term-row"><code>driver non installato: lo installo ora (primo avvio)<br>driver estratto dall'eseguibile (… byte)<br>driver registrato - la webcam 'PS5 Capture' e' pronta</code><span class="m">First run: the driver is unpacked from the exe and registered.</span></div>
<div class="term-row"><code>payload dall'eseguibile (… byte)<br>payload … byte, invio a 192.168.0.36</code><span class="m">The payload is on its way to the console.</span></div>
<div class="term-row"><code>autoloader aggiornato (pldmgr)</code><span class="m">The payload was copied to the autoloader, so it'll start on every boot.</span></div>
<div class="term-row"><code>payload avviato - la PS5 deve mostrare la notifica PSCapture</code><span class="m">The payload is running. Look for the toast on the TV.</span></div>
<div class="term-row ok"><code>porta stream: 5599<br>collegato a 192.168.0.36:5599</code><span class="m">Connected. The pill reads <b>STREAMING</b> with the live fps.</span></div>
</div>
<div class="callout warn" style="margin-top:18px">
<svg class="i"><use href="#i-alert"/></svg>
<p><b>Pill stuck on “IN ATTESA DELLA PS5”</b> (“waiting for the PS5”)? The console is off, not jailbroken yet, or the IP is wrong. You don't need to restart anything: the app retries every 2 seconds and connects the moment ports <code>9021</code> and <code>2121</code> answer.</p>
</div>
</section>
<section id="use" class="reveal">
<div class="sec-head">
<div class="kicker">Use it</div>
<h2>Works wherever a webcam works.</h2>
</div>
<div class="grid g3">
<div class="card target"><h3>Discord</h3>
<div class="path"><i>Settings → Voice & Video → Camera</i> → <b>PS5 Capture</b></div>
<p style="margin-top:10px">Discord asks every camera for 720p, capture cards included. For 1080p60 use screen-share (Nitro).</p>
<div class="res">in calls <b>1280×720</b></div></div>
<div class="card target"><h3>OBS Studio</h3>
<div class="path"><i>Sources → + → Video Capture Device</i> → <b>PS5 Capture</b></div>
<p style="margin-top:10px">Full resolution, ready for recording or streaming.</p>
<div class="res">native <b>1920×1080</b></div></div>
<div class="card target"><h3>ffmpeg</h3>
<div class="path"><code>ffmpeg -f dshow -i video="PS5 Capture" capture.mkv</code></div>
<p style="margin-top:10px">Scripted captures and quick tests.</p>
<div class="res">native <b>1920×1080</b></div></div>
</div>
</section>
<section id="daily" class="reveal">
<div class="sec-head">
<div class="kicker">Daily use</div>
<h2>Open it and play.</h2>
</div>
<div class="grid g3">
<div class="card knob"><span class="k">every day</span>
<p>Open <b>PSCapture.exe</b> and accept the UAC prompt. With the autoloader the stream starts by itself.</p>
<ul>
<li><b>Deploy payload</b>: re-sends the payload by hand, after a reboot without autoloader.</li>
<li><b>Install driver</b>: re-registers the camera if the log shows a driver error.</li>
<li><b>STOP</b> or closing the app: the camera freezes on the last frame and stays listed.</li>
</ul></div>
<div class="card knob"><span class="k">gain</span>
<p>Colour (chroma) strength.</p>
<ul><li><code>1.0</code> is raw and correct.</li><li>Only touch it if colours look off.</li></ul></div>
<div class="card knob"><span class="k">shift px</span>
<p>Moves the picture left or right.</p>
<ul><li><b>Even numbers only</b>: an odd value swaps the colours.</li><li>The console's title text makes a good reference.</li></ul></div>
</div>
</section>
<section id="trouble" class="reveal">
<div class="sec-head">
<div class="kicker">Troubleshooting</div>
<h2>Symptom → fix.</h2>
<p class="sub">Type what you see, or paste a line from the log.</p>
</div>
<div class="search"><svg class="i"><use href="#i-search"/></svg>
<input id="q" type="search" placeholder="e.g. black, 720p, err=126, ATTESA…" autocomplete="off" aria-label="Filter problems"></div>
<div class="issues">
<div class="issue"><div class="sym">Pill stays on <code>AVVIO…</code> or <code>IN ATTESA DELLA PS5</code></div>
<div class="fix"><span class="cause">console off, not jailbroken, or wrong IP</span>Turn the console on, run the jailbreak (ports 9021 and 2121 must be up), check the <b>PS5 IP</b> field. The app keeps retrying.</div></div>
<div class="issue"><div class="sym">Log repeats <code>PS5 non raggiungibile (…), riprovo</code></div>
<div class="fix"><span class="cause">console not reachable</span>Same as above. It connects by itself as soon as the console answers.</div></div>
<div class="issue"><div class="sym">Log: <code>elfldr :9021 non raggiungibile</code></div>
<div class="fix"><span class="cause">payload loader not running</span>Run the jailbreak again, then press <b>Deploy payload</b>.</div></div>
<div class="issue"><div class="sym">No <b>PS5 Capture</b> camera in Discord or OBS</div>
<div class="fix"><span class="cause">driver not registered</span>Press <b>Install driver</b> and read the next log line: it reports the real error.</div></div>
<div class="issue"><div class="sym">Log: <code>ERRORE: driver non scrivibile in C:\Program Files\PSCapture (serve admin?)</code></div>
<div class="fix"><span class="cause">app not elevated</span>Close it, start <code>PSCapture.exe</code> again and answer <b>Yes</b> to the UAC prompt.</div></div>
<div class="issue"><div class="sym">Log: <code>elevazione rifiutata: continuo senza privilegi</code></div>
<div class="fix"><span class="cause">UAC prompt answered “No”</span>Streaming can still work, but the driver can't be installed. Restart the app and click <b>Yes</b>.</div></div>
<div class="issue"><div class="sym">Log: <code>ERRORE caricamento dll (err=126)</code></div>
<div class="fix"><span class="cause">antivirus quarantined the driver</span>Restore and allow <code>pscapture.dll</code> in your antivirus, then press <b>Install driver</b> again.</div></div>
<div class="issue"><div class="sym">Log: <code>autoloader: copia FALLITA (pldmgr c'e'?)</code></div>
<div class="fix"><span class="cause"><code>pldmgr</code> not installed</span>Harmless: streaming works now. Without the autoloader, press <b>Deploy payload</b> after every console reboot.</div></div>
<div class="issue"><div class="sym">Camera is listed but the image is black</div>
<div class="fix"><span class="cause">stream not running</span>Check the pill. Press <b>Deploy payload</b> and/or <b>START STREAMING</b>.</div></div>
<div class="issue"><div class="sym">Log: <code>stream caduto, riconnetto</code></div>
<div class="fix"><span class="cause">network hiccup or console went to rest mode</span>The app reconnects by itself. If it happens often, use a cable instead of Wi-Fi.</div></div>
<div class="issue"><div class="sym">Colours look wrong (reddish skin, orange sky)</div>
<div class="fix"><span class="cause"><code>gain</code> was changed</span>Set <code>gain</code> back to <code>1.0</code> and press <b>Apply</b>.</div></div>
<div class="issue"><div class="sym">Colours inverted, black bar, picture off-centre</div>
<div class="fix"><span class="cause">alignment</span>Tune <code>shift px</code> using <b>even</b> values only. An odd value swaps the colours.</div></div>
<div class="issue"><div class="sym">Discord shows only 720p</div>
<div class="fix"><span class="cause">Discord's limit, not PSCapture's</span>Discord caps every camera at 720p in calls. Use OBS for 1080p, or Discord screen-share (1080p60 with Nitro).</div></div>
<div class="issue"><div class="sym">OBS sees the camera, Discord doesn't</div>
<div class="fix"><span class="cause">Discord was open during the driver install</span>Quit Discord completely (tray icon too) and reopen it.</div></div>
<div class="issue"><div class="sym">Anything else</div>
<div class="fix"><span class="cause">read the logs</span><code>pscapture-app.log</code> (next to the exe, or in <code>%TEMP%</code>) and the console log <code>/data/pscapture.log</code> over FTP. Then <a href="https://github.com/fstat13/PSCapture/issues">open an issue</a> with both.</div></div>
<div class="noresult" hidden>No match. <a href="https://github.com/fstat13/PSCapture/issues">Open an issue</a> with your <code>pscapture-app.log</code>.</div>
</div>
</section>
<section id="build" class="reveal">
<div class="sec-head">
<div class="kicker">Build from source</div>
<h2>Two halves, two toolchains.</h2>
<p class="sub">The repository holds sources only; ready-made binaries are on <a href="https://github.com/fstat13/PSCapture/releases">Releases</a>. The full walkthrough (toolchain install, checks, pitfalls) is in <a href="https://github.com/fstat13/PSCapture/blob/main/docs/BUILD.md">BUILD.md</a>.</p>
</div>
<div class="build-step">
<div class="num">Step 1 · console</div>
<h3>Payload → <code>pscapture.elf</code></h3>
<p>Needs Docker and the PS5 payload SDK image (prospero-clang; any tag works, here <code>ps5sdk:18</code>).</p>
<div class="codeblock"><pre><span class="p">$ </span>docker run --rm -v "$PWD/payload:/payload" -w /payload ps5sdk:18 make</pre></div>
</div>
<div class="build-step">
<div class="num">Step 2 · PC</div>
<h3>App and driver → <code>pscapture.exe</code> + <code>pscapture.dll</code></h3>
<p>Needs MinGW-w64 (<code>gcc</code> + <code>windres</code>). <b>The order matters</b>: the <code>.res</code> embeds the driver and the payload exactly as they are on disk.</p>
<div class="codeblock"><pre><span class="c"># from the repo root</span>
cp payload/pscapture.elf pc/
cd pc
<span class="c"># 1) the capture-card driver (DirectShow source filter)</span>
gcc -O2 -shared -static -static-libgcc -o pscapture.dll ps5cam.c \
-lole32 -loleaut32 -luser32 -ladvapi32 -lws2_32
<span class="c"># 2) bundle icon + payload + driver into the resource object</span>
windres pscapture.rc -O coff -o pscapture.res
<span class="c"># 3) the single-file app</span>
gcc -O2 -mwindows -o pscapture.exe pscapture.c pscapture.res \
-lws2_32 -lshell32 -ladvapi32 -luxtheme</pre></div>
</div>
<div class="callout info" style="margin-top:22px">
<svg class="i"><use href="#i-info"/></svg>
<p><b>The two classic mistakes.</b> Rebuilding the DLL or the payload <i>after</i> <code>windres</code> leaves the old ones inside the exe, so always go DLL → windres → exe. And <code>-static -static-libgcc</code> on the DLL is mandatory: without it Windows may refuse to load the driver with “the specified module could not be found” (missing MinGW runtime).</p>
</div>
</section>
<section id="faq" class="reveal">
<div class="sec-head">
<div class="kicker">FAQ</div>
<h2>Questions.</h2>
</div>
<div class="faq">
<details><summary>Does it work on firmwares other than 13.60?</summary>
<div class="body"><p>The PC side works with any firmware: the app and the driver only use TCP, FTP and shared memory. The console payload is the version-specific part. It was built and tuned on <b>13.60</b> using display-engine anchors found on that firmware. Other versions may need a small porting pass to find the same anchors. <a href="https://github.com/fstat13/PSCapture/issues">Open an issue</a> with your firmware version.</p></div></details>
<details><summary>Why is the camera 720p in Discord calls?</summary>
<div class="body"><p>That's Discord's voice engine: it requests 1280×720 from every camera. In OBS, PS5 Capture runs at the full 1920×1080. Discord's screen-share goes up to 1080p60 with Nitro.</p></div></details>
<details><summary>Do I need a capture card or Remote Play?</summary>
<div class="body"><p>No. PSCapture never touches Remote Play. The payload reads the display engine on the console itself and sends raw frames over your LAN.</p></div></details>
<details><summary>Does it capture game audio?</summary>
<div class="body"><p>Not yet. PSCapture is video-only for now.</p></div></details>
<details><summary>Does it work on macOS or Linux?</summary>
<div class="body"><p>The PC side is Windows-only, because the camera is a DirectShow device.</p></div></details>
<details><summary>How do I uninstall it?</summary>
<div class="body"><ol>
<li>Close the app.</li>
<li>Run <code>rundll32 "%ProgramFiles%\PSCapture\pscapture.dll",DllUnregisterServer</code> to remove the camera.</li>
<li>Delete <code>C:\Program Files\PSCapture</code>.</li>
<li>Optional, on the console: delete <code>/data/pldmgr/payloads/pscapture/</code> so the autoloader stops starting it.</li>
</ol></div></details>
</div>
</section>
<div class="band reveal">
<div>
<h2>Useful? Leave a star.</h2>
<p>PSCapture is free. A star on GitHub helps other PS5 homebrew users find it.</p>
</div>
<div class="cta">
<a class="btn btn-primary" href="https://github.com/fstat13/PSCapture"><svg class="i"><use href="#i-star"/></svg>Star on GitHub <span class="stars" data-stars hidden></span></a>
<a class="btn btn-ghost" href="https://github.com/fstat13/PSCapture/issues">Report an issue</a>
</div>
</div>
</main>
<footer>
<div class="wrap">
<div class="foot">
<div>
<a class="logo" href="#top"><img src="pscapture.png" alt="">PSCapture</a>
<p>Your PS5 screen anywhere on your LAN. No card, no cloud.<br>by <b>fstat13</b></p>
</div>
<div>
<h4>Guides</h4>
<ul>
<li><a href="https://github.com/fstat13/PSCapture/blob/main/docs/GUIDE.md">Step-by-step guide</a></li>
<li><a href="https://github.com/fstat13/PSCapture/blob/main/docs/BUILD.md">Build from source</a></li>
<li><a href="https://github.com/fstat13/PSCapture/blob/main/docs/INSTALLER.md">What the installer does</a></li>
<li><a href="https://github.com/fstat13/PSCapture/blob/main/docs/REVERSE_ENGINEERING.md">Reverse engineering</a></li>
<li><a href="https://github.com/fstat13/PSCapture/blob/main/docs/ENGINEERING_LOG.md">Engineering log</a></li>
</ul>
</div>
<div>
<h4>Project</h4>
<ul>
<li><a href="https://github.com/fstat13/PSCapture">GitHub</a></li>
<li><a href="https://github.com/fstat13/PSCapture/releases">Releases</a></li>
<li><a href="https://github.com/fstat13/PSCapture/issues">Issues</a></li>
<li><a href="https://github.com/fstat13/PSCapture/blob/main/LICENSE">License</a></li>
</ul>
</div>
</div>
<div class="legal">
<span>© 2026 fstat13 · source-available</span>
<span>Not affiliated with Sony Interactive Entertainment. “PlayStation” and “PS5” are trademarks of their respective owners.</span>
</div>
</div>
</footer>
<script src="main.js"></script>
</body>
</html>