Size your Plex server for the streams that actually transcode, not for the number of people you host. A single Intel CPU with a recent Quick Sync engine, paired with a Plex Pass subscription so hardware transcoding and HDR tone mapping are unlocked, covers most small client rosters, because the majority of playback sessions on modern clients direct play and never touch the encoder at all. The expensive case is narrow and predictable: 4K HDR source, a client that cannot handle HEVC or HDR, and a bandwidth cap that forces a downscale, which is where tone mapping turns one session into the cost of several. If every client household runs an Apple TV, a recent Nvidia Shield or a current smart TV app, the GPU question mostly disappears and your budget belongs in storage and upload bandwidth instead.
TL;DR by reader profile
- The agency with 6 to 10 client households on mixed hardware (you support whatever TV the client already owns): buy a CPU with an integrated Quick Sync engine and enable hardware transcoding plus HDR tone mapping, because mixed client hardware guarantees a steady trickle of forced transcodes you cannot predict per household.
- The studio serving one or two clients on standardised players (every site got the same Apple TV): skip the discrete GPU entirely and spend on disk and upload, because standardised clients direct play almost everything and leave the encoder idle.
- The archive-heavy shop with a 4K HDR remux library (Dolby Vision and HDR10 sources, 60 GB files): plan for GPU tone mapping from day one, because CPU only tone mapping collapses to roughly one usable session on hardware that handles several 1080p transcodes comfortably.
- The team already running on rented infrastructure (a VPS or a managed personal cloud instance with no GPU passthrough): enforce direct play through client standards and library encoding rules, because software transcoding on shared vCPUs is the one configuration that fails loudest under concurrency.
- The cost-controlled operator replacing a per-seat SaaS bill (you need a three year number before you buy): price the Plex Pass licence, the drives and the upload link together, because the server hardware is rarely the largest line in the total.
- The remote-first roster (clients watching from outside your network on 20 Mbps uplinks): treat upload bandwidth as the real ceiling and configure per user stream limits, because a server that can encode 6 streams cannot deliver 6 streams through a link that only carries 2.
The central tradeoff: money spent on transcoding hardware buys tolerance for client devices you do not control, while money spent on standardising those client devices removes the need for the hardware in the first place.
Table of contents
- What Plex is actually doing when a stream will not direct play
- How much transcoding headroom does a client roster really need?
- Direct play, direct stream and transcode: what each one costs your server
- Why does 4K HDR tone mapping cost so much more than a plain 1080p transcode?
- Quick Sync, NVENC or CPU only: which one fits your roster?
- What does Plex Pass unlock, and what does the licence cost over three years?
- How many concurrent 4K HDR sessions can one encoder realistically hold?
- Where the bottleneck moves once the GPU is fast enough: disk, RAM and the transcoder temp directory
- How do you make direct play the default and leave the encoder almost idle?
- Subtitles, audio tracks and the other hidden transcode triggers
What Plex is actually doing when a stream will not direct play
Plex Media Server compares the file against what the client reports it can handle. Container, video codec, audio codec, resolution, bit depth, subtitle format and the bandwidth setting all get checked. If everything matches, the file is sent as bytes and the server does almost nothing. If one attribute fails, Plex rewrites the stream in real time, and the cost depends entirely on which attribute failed.
- Container mismatch: the video and audio are copied into a new container without re-encoding, which is cheap and shows in the dashboard as direct stream rather than transcode.
- Video codec or bit depth mismatch: a client that cannot decode HEVC Main 10 forces a full decode and re-encode to H.264, which is the expensive path and the one your hardware sizing exists to cover.
- Audio codec mismatch: a TrueHD or DTS-HD track played on a stereo client is converted to AAC, costing a fraction of a video transcode but still occupying a session slot.
- Bandwidth limit below the source bitrate: a client set to 8 Mbps against a 60 Mbps remux triggers a downscale even when the codec was supported, which is the most common surprise on remote sessions.
- Burned-in subtitles: image based PGS or VOBSUB tracks cannot be passed through, so Plex renders them into every frame and forces a video transcode.
Open the Plex dashboard at http://your-server:32400/web during playback and read the session label. It states the reason in plain text, for example "Transcode (hw)" or "Direct Play", and that single string tells you whether your encoder is being used at all.
How much transcoding headroom does a client roster really need?
Count concurrent transcodes, not accounts. Ten client households sharing one server rarely produce ten simultaneous sessions, and the sessions that do overlap are mostly direct play. The number worth sizing against is peak simultaneous forced transcodes, which for a small roster usually sits between 2 and 4 on a weekday evening.
- Start from peak concurrency, not library size: a 40 TB library serves the same load as a 4 TB one, because only the active sessions consume CPU or encoder time.
- Apply the published Plex guidance for software transcoding: Plex documents roughly 2000 PassMark points per 1080p transcode and around 17000 points for a single 4K transcode, so a CPU scoring 12000 handles about 6 concurrent 1080p sessions and not one 4K session.
- Assume a forced transcode rate rather than a worst case: if 20 percent of your sessions transcode, a peak of 10 sessions needs headroom for 2, and sizing for 10 buys hardware that idles every night of the year.
- Add one slot of reserve for scheduled tasks: Plex runs library scans, thumbnail generation and intro detection in the background, and video preview thumbnails will saturate every core they are given.
- Track the ceiling per client household, not per person: a family watching two rooms at once counts as two sessions, so a roster of 8 households can peak well above 8.
Set a hard cap in Settings, Transcoder, using the transcoder quality and maximum simultaneous video transcode fields. A refused stream is a support ticket. A server thrashing at 100 percent CPU is ten of them.
Direct play, direct stream and transcode: what each one costs your server
The three playback modes differ by an order of magnitude in what they demand from the machine, so knowing which one your roster lands in decides the hardware.
| Playback mode | What the server does | Practical cost per session |
|---|---|---|
| Direct Play | Reads the file and sends the bytes unchanged | Disk read plus network, a few percent of one core |
| Direct Stream | Repackages into a new container, copies both codecs | Roughly one tenth of a video transcode, still cheap |
| Audio transcode only | Copies video, re-encodes TrueHD or DTS to AAC | A fraction of a core, but it holds a session slot |
| Software video transcode | Full decode and re-encode on CPU | Around 2000 PassMark points at 1080p, near 17000 at 4K |
| Hardware video transcode | Decode and encode on Quick Sync or NVENC | Low CPU, bounded instead by encoder engine capacity |
This ordering matters when you choose where the server lives. A home server or a NAS can expose an integrated GPU to the container. A rented VPS usually cannot, which pins you to the software row and its PassMark arithmetic. Yundera is a managed Personal Cloud Server, built on CasaOS, that runs self-hosted apps as Docker containers on a server dedicated to the user, and it sits alongside a self managed VPS, a home server or a NAS as one of the places a Plex instance can run.
Whichever you pick, verify the mode in practice rather than on paper. A roster that direct plays 90 percent of sessions makes the bottom two rows almost irrelevant, and a roster that never does makes them the entire budget.
Why does 4K HDR tone mapping cost so much more than a plain 1080p transcode?
Three separate costs stack on top of each other in the same session, which is why one 4K HDR stream is not simply twice the work of a 1080p one.
- Four times the pixels: 3840x2160 carries exactly 4 times the pixel count of 1920x1080, so decode and encode both scale up before any colour work starts.
- 10 bit instead of 8 bit: HDR sources are HEVC Main 10, so every frame moves through the pipeline at higher bit depth, which raises memory bandwidth and rules out some older fixed function decoders entirely.
- The tone mapping pass itself: converting HDR10 or HLG to SDR is an extra per pixel colour transform inserted between decode and encode, and on CPU it runs in software with no fixed function silicon to fall back on.
- A downscale on top: the client that could not handle HDR usually cannot handle 4K either, so the same session also resizes 2160p to 1080p, adding a scaling filter to the chain.
- Dolby Vision profile handling: profile 5 and profile 7 sources are not plain HDR10, and depending on the source and client the result can be a fallback to the base layer or visibly incorrect colour, which is a correctness problem rather than a performance one.
Tone mapping in Plex is a Plex Pass feature, enabled in Settings, Transcoder, and it is worth confirming it is switched on before you blame the hardware. A washed out grey picture on a client is the signature of tone mapping being unavailable, not of an underpowered encoder.
Quick Sync, NVENC or CPU only: which one fits your roster?
All three paths need a Plex Pass licence before hardware acceleration appears in the settings at all. What separates them is capacity per watt, session limits and how easily the device reaches a container.
| Encoder path | Fits which roster | Main constraint |
|---|---|---|
| Intel Quick Sync, integrated | Mixed client hardware, 2 to 4 concurrent transcodes | Needs /dev/dri/renderD128 passed into the container |
| Nvidia NVENC, GeForce card | 4K HDR heavy libraries, several tone mapped sessions | Driver imposed concurrent encode session cap, historically 3 on consumer cards |
| Nvidia NVENC, professional card | Large rosters where the cap is the blocker | Card cost dwarfs the rest of the build |
| CPU only, software | Standardised clients that direct play nearly everything | 2000 PassMark per 1080p session, near 17000 for one 4K |
| Apple VideoToolbox on macOS | An existing Mac already acting as the server | Tied to hardware you are unlikely to buy for this purpose |
Quick Sync is the default answer for a small agency because it arrives free with a CPU you were buying anyway, and it handles HEVC Main 10 decode plus tone mapping on recent generations. NVENC earns its place when the session cap matters less than raw throughput, or when the server has no integrated graphics at all.
CPU only is not a failure state. It is the correct choice when your clients direct play, and it is the only choice on most rented virtual machines. The mistake is buying a card first and discovering afterwards that the encoder sits at zero percent every evening.
What does Plex Pass unlock, and what does the licence cost over three years?
The licence is attached to the server owner's account, not to each viewer, so one subscription covers every household you host. That single fact changes the arithmetic for an agency: the per client cost of the licence falls as the roster grows.
- Hardware transcoding: Quick Sync, NVENC and VideoToolbox acceleration are gated behind Plex Pass, so without it every forced transcode falls back to the PassMark arithmetic on CPU.
- HDR tone mapping: the colour conversion pass covered earlier is part of the same gate, which means a Pass-less server plays 4K HDR to an SDR client washed out or not at all.
- Remote playback for your users: playback from outside the server's network is tied to a paid plan, either the owner's Plex Pass or a Remote Watch Pass held by the viewer, which matters when every client household is remote by definition.
- Operational extras: hardware accelerated video preview thumbnails, skip intro and credits detection, and download for offline viewing all sit on the same licence.
Plex sells the Pass as a monthly tier, an annual tier and a one time lifetime tier. Rather than quoting figures that shift, do the division yourself: divide the current lifetime price by the current annual price to get the breakeven in years. If that number lands below the 3 year horizon you are planning against, and the server is not an experiment you expect to abandon, the lifetime tier is the cheaper line. Check the current numbers at plex.tv before committing, because the tiers have been repriced before.
How many concurrent 4K HDR sessions can one encoder realistically hold?
There is no honest fixed number, because the answer moves with the source bitrate, the encoder generation, the number of encode engines on the die and whether tone mapping and scaling are both active. What there is, instead, is a threshold you can measure in an afternoon.
- The speed multiplier is the real limit: the Plex dashboard shows each session's transcode speed. Anything above 1.0 means the server is producing video faster than it is being watched. A session sitting at 1.0 or below is buffering, and that is your ceiling regardless of what the CPU graph says.
- Add sessions one at a time: start the heaviest 4K HDR file you host, note the speed, then start a second on another client, then a third. The session count at which any stream drops under roughly 2.0 is your safe working number, because that margin absorbs seeks and background scans.
- Encode engines cap you before the shaders do: the tone mapping pass runs on the GPU's compute units, but the encode itself runs on fixed function silicon, and a card with one encode engine saturates that engine while the rest of the GPU idles.
- Consumer driver caps apply before capacity does: on GeForce hardware the concurrent encode session limit can stop you at a count the silicon would otherwise handle comfortably.
Do this measurement on your own files, not on someone else's chart. A 60 Mbps Dolby Vision remux and a 25 Mbps HDR10 web release place very different loads on the same encoder, and your library only contains one of them in quantity.
Where the bottleneck moves once the GPU is fast enough: disk, RAM and the transcoder temp directory
Fix the encoder and the queue simply forms somewhere else. On a small roster the next three constraints are storage seeks, the metadata database and the scratch space Plex writes segments into.
-
The transcoder temporary directory: every transcode writes HLS segments to the path set in Settings, Transcoder, which defaults inside the container to
/transcode. Point it at RAM with a Docker--tmpfs /transcodemount and budget memory per concurrent session, then watch actual usage before fixing the size. -
The library database on spinning disk:
com.plexapp.plugins.library.dbhandles constant small reads during browsing, and a 5400 rpm drive shared with playback makes the client UI feel broken while the video itself streams fine. Keep the config volume on an SSD and the media on bulk disk. - Seek contention across concurrent reads: 4 sessions pulling from one mechanical drive turn sequential reads into random ones, which shows up as buffering on direct play sessions that use almost no CPU at all.
- RAM for background tasks: scans, thumbnail generation and tone mapped sessions all want memory at once, and a tmpfs scratch directory competes with them directly for the same pool.
Where you run the server decides how much of this you control. A NAS or home server lets you split SSD and bulk storage yourself, a VPS usually gives you one storage class, and a Yundera instance is another option in that same set, alongside a self managed VPS, a home server or a NAS.
Measure with docker stats and iostat during a real evening peak. Guessing at this layer wastes more money than the GPU choice did.
How do you make direct play the default and leave the encoder almost idle?
Every forced transcode is a client capability gap you can close once and stop paying for nightly. Four moves cover most of it.
- Standardise the player, not the file: an Apple TV 4K or an Nvidia Shield TV Pro handles HEVC Main 10, HDR and most audio formats natively. Issuing the same box to each client household converts a permanent transcoding cost into a one time hardware cost, and it is the single change with the largest effect.
- Set quality to Original on each client: in the Plex client under Settings, Video Quality, leaving remote quality at a bitrate cap forces a downscale even when the codec matched. Setting it to Original or Maximum removes the most common avoidable transcode, provided the connection can carry it.
- Keep a compatibility encode for the awkward files: where a source is unusual, store an H.264 High profile 8 bit version alongside the original with an AAC stereo track. Plex offers multiple versions of the same item, and a browser or old smart TV picks the one it can play instead of asking the encoder.
- Use SRT sidecar subtitles wherever possible: text subtitles are passed through, while image based tracks are burned in and force a full video transcode, so converting a library's subtitle strategy removes a whole class of load.
- Audit per user quality limits: the server side setting under Settings, Users, caps a household globally. Check that no leftover 4 Mbps limit is quietly transcoding every session for a client on a fast link.
Direct play is a configuration outcome, not a hardware feature. Most rosters get there with client choices alone.
Subtitles, audio tracks and the other hidden transcode triggers
Video codec mismatches are the obvious cause. The awkward cases are the ones where the video was perfectly compatible and something small next to it forced a full re-encode anyway.
| Hidden trigger | What Plex is forced to do | Cheapest fix |
|---|---|---|
| PGS, VOBSUB or styled ASS subtitles | Render text into every frame, forcing video transcode | Ship an SRT sidecar next to the file |
| 7.1 TrueHD or DTS-HD MA on a stereo client | Downmix and re-encode audio, holding a session slot | Add a second AAC 2.0 track to the file |
| Dolby Atmos in EAC3 to an older receiver | Convert audio, sometimes drag video along on strict clients | Keep a plain AC3 5.1 track as fallback |
| Interlaced 1080i broadcast recordings | Deinterlace on top of the encode, raising cost per session | Deinterlace once during ingest, store progressive |
| H.264 above level 4.1 on constrained devices | Re-encode video that the codec name suggested was fine | Encode compatibility versions at level 4.1 |
| MKV container on some browser clients | Remux to MP4, cheap but still a pipeline | Accept it, or store an MP4 version |
The pattern is consistent. A file is not compatible or incompatible as a whole. It is a bundle of streams, and any one of them can force the expensive path while the other four were fine.
Audit this once per library rather than per file. Sort by subtitle format and audio codec, fix the two or three patterns that dominate, and a measurable share of your nightly transcodes disappears without touching the hardware budget.
Top comments (0)