Jellyfin hardware acceleration on a NAS or mini PC (2026 guide)
Set up Jellyfin hardware acceleration for Intel QSV, AMD VA-API and Nvidia NVENC, including Docker device passthrough and the dashboard settings.
By Swiftly Player8 min read
Disclosure: we build Swiftly Player, one of the clients in this article. We point out where other apps do better.
Jellyfin can transcode video with the CPU alone, but that gets slow fast, especially with 4K or more than one stream at once. Turning on hardware acceleration lets the GPU do that work instead. This guide walks through when you need it, how to pass the GPU into Docker, and how to turn it on in the dashboard, for Intel, AMD and Nvidia hardware.
TL;DR
- You only need hardware acceleration when a client cannot Direct Play a file and the server has to transcode. Direct Play skips this whole topic.
- Intel calls its method Quick Sync (QSV) on newer chips and VA-API on Linux in general. AMD uses VA-API on Linux and AMF on Windows. Nvidia uses NVENC (encode) and NVDEC (decode).
- In Docker, the GPU has to be passed into the container explicitly:
/dev/drifor Intel and AMD, the Nvidia Container Toolkit and--gpus allfor Nvidia. - The setting itself lives in Dashboard → Playback → Transcoding, in the "Hardware acceleration" dropdown.
- Always use
jellyfin-ffmpeg. A generic FFmpeg build from somewhere else only gets partial acceleration.
Do you need this at all?
Jellyfin's own transcoding guide lists four playback types in order of server load: Direct Play, Remux, Direct Stream, and Transcode, with Transcode being "the highest server demand" (jellyfin.org, Transcoding). Direct Play means the file goes to the client exactly as it is stored, with no conversion at all, so hardware acceleration never comes into play. Transcoding only happens when the client tells the server it cannot handle the file's codec, container or bitrate.
If your library is mostly H.264 or HEVC in standard containers and your clients support them, you may rarely transcode at all. Hardware acceleration matters most when you have 4K HDR files, older or restrictive clients, or more than one person watching different things at once.
The three hardware paths
| Vendor | Method | Where | Notes |
|---|---|---|---|
| Intel | Quick Sync (QSV) or VA-API | Windows and Linux | QSV uses a modified VA-API under the hood with Intel's own driver; both are documented options |
| AMD | VA-API (Linux) or AMF (Windows) | Linux preferred | Jellyfin's own guide calls Linux VA-API the recommended path and AMF on Linux "not recommended" |
| Nvidia | NVENC (encode) / NVDEC (decode) | Windows and Linux | Needs a driver of at least 522.25 on Windows or 520.56.06 on Linux for Jellyfin 10.11 and up |
Source for all three: jellyfin.org, Hardware Acceleration, Intel guide, AMD guide, Nvidia guide.
Jellyfin also documents Apple VideoToolbox on macOS and Rockchip RKMPP on some ARM boards, for anyone running Jellyfin outside a typical Intel/AMD/Nvidia box.
Codec support depends on GPU generation, not just brand
Older GPUs often decode but cannot encode newer codecs, or only handle 8-bit and not 10-bit. A few examples from Jellyfin's own hardware pages:
| Codec | Intel | AMD | Nvidia |
|---|---|---|---|
| HEVC 8-bit | Gen 9 (Skylake, 6th Gen Core) and up | Polaris (RX 400) and up for encode | Maxwell 2nd Gen and up |
| HEVC 10-bit | Gen 9.5 (Kaby Lake, 7th Gen Core) and up | Polaris and up | 10-bit encode needs Pascal or newer |
| AV1 decode | Gen 12 (Tiger Lake, 11th Gen) and up | RX 6000 series and up (not 6400/6500) | Ampere and up |
| AV1 encode | Gen 12.5 (Arc A-series, Meteor Lake) | RX 7000 series and up | Ada Lovelace and up |
Check your exact chip against these pages before assuming a feature will work; a "supports hardware transcoding" spec sheet is not the same as "supports AV1 encoding."
Step by step: Docker device passthrough
Most NAS and mini PC installs run Jellyfin in Docker, and the container needs the GPU device explicitly passed in. The base install otherwise looks like the compose example in Jellyfin's own docs, with /config, /cache and a media mount (jellyfin.org, Container installation).
Intel or AMD (Linux, VA-API/QSV)
- Find your host's render group ID:
getent group render | cut -d: -f3. - Add the render device to the container:
--device /dev/dri/renderD128:/dev/dri/renderD128. - Add the container to that render group:
--group-add="122"(use the actual number from step 1). - Make sure the
jellyfinuser inside the container is in therendergroup; Jellyfin's Intel and AMD guides both call this out explicitly. - Restart the container.
(Source: Intel hardware acceleration guide, AMD hardware acceleration guide.)
Nvidia (Linux, NVENC/NVDEC)
- Install the NVIDIA Container Toolkit on the host.
- Run the container with
--runtime=nvidia --gpus all. - Set the environment variables
NVIDIA_DRIVER_CAPABILITIES=allandNVIDIA_VISIBLE_DEVICES=all. - Add your user to the
videogroup on the host:sudo usermod -aG video $USER. - If the container was already running, run
docker exec -it --user root jellyfin ldconfigonce after setup.
(Source: Nvidia hardware acceleration guide.)
Not running Docker?
The same device access applies without a container: on Windows, install the latest driver from the vendor directly (using DDU to remove old drivers first if you're jumping from a much older GPU); on native Linux, install jellyfin-ffmpeg from your distribution's repository and add the jellyfin service user to the render group.
Step by step: turn it on in the dashboard
- Sign in as an administrator and open the Dashboard.
- Go to Playback, then the Transcoding tab.
- In the "Hardware acceleration" dropdown, pick your method: QSV for a modern Intel GPU, VA-API for Intel or AMD on Linux, or NVENC for Nvidia.
- Select the correct device if more than one GPU is listed.
- Enable hardware decoding for the codecs your GPU actually supports, based on the codec table above. Leaving unsupported codecs checked does nothing useful and can cause errors.
- Enable hardware encoding if you want the GPU to handle the encode side too, not just decode.
- Save, then start a playback that you know needs transcoding (an unsupported codec or a resolution the client has to downscale) and check Dashboard → Playback for the active session. Jellyfin's own transcoding docs confirm that "the type being used will be listed in the dashboard when playing a file" (jellyfin.org, Transcoding).
Common errors
- Partial acceleration instead of none, or higher CPU use than expected: some pipeline stages (for example specific filters or 10-bit H.264, which has no hardware decoder on Intel, Nvidia or AMD) fall back to software. This is documented behavior, not a bug, and shows up as unexpectedly high CPU usage during what should be a hardware transcode.
- Nothing happens after enabling QSV in a Docker container on Windows: Jellyfin's Intel guide states plainly that "QSV is not available on Windows Docker and WSL/WSL2." Use VA-API's Linux path instead, or run Jellyfin natively on Windows.
- "Device not found" or no GPU listed: usually a missing
--device /dev/dri/renderD128mapping, or the container'sjellyfinuser not being in the host's render group. Recheck the group ID withgetent group render— it differs between hosts. - Using a plain FFmpeg build instead of
jellyfin-ffmpeg: Jellyfin's hardware acceleration overview warns that "using FFmpeg binaries downloaded from somewhere else will result in partial acceleration." Thejellyfin-ffmpegpackage or the version bundled in the official Docker image is built with the right flags. - AMD on Linux configured with AMF instead of VA-API: Jellyfin's AMD guide calls AMF on Linux "not recommended," since it is closed source with more limited support than the open Mesa/VA-API path.
- Old Nvidia driver: Jellyfin 10.11 needs at least driver 522.25 on Windows or 520.56.06 on Linux; an older driver can silently fail to expose NVENC/NVDEC to the container.
FAQ
Does hardware acceleration make the picture look worse?
Not by design. Hardware encoders can produce slightly different output than software encoders at the same bitrate on some very demanding scenes, but the point of turning it on is server load, not picture quality; if quality is your priority over server load, software transcoding at a high bitrate remains an option.
My GPU is old. Is it still worth enabling?
Check it against the codec tables in Jellyfin's Intel, AMD and Nvidia guides first. A GPU that only handles 8-bit H.264 still saves real CPU time versus software transcoding for any file that needs a codec conversion, even if it cannot touch HEVC or AV1.
Do I need hardware acceleration if I only ever Direct Play?
No. If every client you use can already play your files without any conversion, hardware acceleration has nothing to do, because transcoding never starts. Check which codecs and containers your clients support before assuming you need this setup at all.
Can I use two GPUs at once, for example an Intel iGPU and a discrete Nvidia card?
Jellyfin's dashboard lets you pick one hardware acceleration method and one device at a time in the Transcoding tab. Running multiple GPUs for load balancing is possible in more advanced setups but is outside the scope of the standard dashboard settings.
How do I know it's actually working and not silently falling back to software?
Start a session that forces a transcode, then check the active session in Dashboard → Playback. Jellyfin lists the transcoding type there while the session is running.
Summary
Hardware acceleration in Jellyfin only matters once a file needs to be transcoded, so the first and cheapest fix is always making Direct Play possible in the first place. When transcoding is unavoidable, the setup is the same shape for Intel, AMD and Nvidia: pass the GPU device into the container correctly, install jellyfin-ffmpeg, and pick the matching method in Dashboard → Playback → Transcoding. Check the codec support tables for your exact hardware generation before assuming a feature like HEVC 10-bit or AV1 will work, and verify the result in the dashboard's active sessions rather than guessing from CPU usage alone.


