Jellyfin hardware acceleration: Quick Sync, NVENC, AMF, VideoToolbox

Updated ยท 6 min read

Jellyfin hardware acceleration hands video conversion to your graphics chip instead of the processor. This page shows which option to pick for your GPU, how to turn it on, how to pass the GPU into Docker, and how to prove it is working.

When Jellyfin converts video

Most of the time Jellyfin sends the file as it is, and the app on the TV or phone plays it. That is direct play, and it costs the server almost nothing. Jellyfin converts (transcodes) only when the app can't handle the file's format, when the stream is too big for the connection, which is common when you watch away from home, or when subtitles have to be drawn into the picture.

On the processor, one 4K conversion can keep a whole PC busy and still stutter. Nearly every graphics chip made in the last ten years has a video engine built for exactly this job. Turning it on is free; it is part of Jellyfin, and nothing needs to be bought or unlocked.

Which option for your GPU

Jellyfin's documentation lists one method per GPU and system. Pick the row that matches the computer that runs Jellyfin, not the one you watch on.

GraphicsWindowsLinux and DockerMac
IntelIntel QSVIntel QSV (VA-API for chips older than 5th gen Core)VideoToolbox
NVIDIANVIDIA NVENCNVIDIA NVENCNot available
AMDAMD AMFVA-APIVideoToolbox
Apple siliconNot availableNot availableVideoToolbox

Jellyfin's docs also recommend running its own build of FFmpeg, jellyfin-ffmpeg, which the official installers and the official Docker image already include.

Turn it on by hand

  1. Update the graphics driver. On Windows, install the current driver from Intel, NVIDIA or AMD. For NVIDIA, Jellyfin 10.11 and later need at least driver 522.25 on Windows or 520.56.06 on Linux. On Linux, add the jellyfin user to the render group so it may use the GPU, then restart Jellyfin.
  2. Open the transcoding settings. Sign in as an administrator and go to Dashboard > Playback > Transcoding.
  3. Choose the method. Under Hardware acceleration, pick the option from the table above.
  4. Tick only the formats your GPU can decode. Under Enable hardware decoding for, tick H264 and the others your chip supports. Older chips lack HEVC 10-bit, VP9 or AV1; ticking one they can't do makes those videos fail instead of falling back. Intel's, AMD's and NVIDIA's codec tables say what each generation handles.
  5. Leave hardware encoding on. Keep Enable hardware encoding ticked. Turn on Allow encoding in HEVC format only if the apps you use play HEVC.
  6. Turn on tone mapping for HDR. Tick Enable Tone mapping so HDR films don't look washed out on ordinary screens. Intel on Linux can use Enable VPP Tone mapping instead; on a Mac there is a VideoToolbox option as well.
  7. Save and test. Click Save at the bottom, then play something that needs converting, as described below.

Careful: Jellyfin itself warns that hardware acceleration can make playback unstable with old drivers. If nothing plays after you save, set Hardware acceleration back to None, save, and work through the failures below.

Docker: give the container the GPU

A container sees no graphics hardware unless you pass it in. For Intel or AMD on Linux, pass the render device and the host's render group. Find the group's number with getent group render | cut -d: -f3, and put it where 122 is below.

services:
  jellyfin:
    image: jellyfin/jellyfin
    user: 1000:1000
    group_add:
      - "122"
    devices:
      - /dev/dri/renderD128:/dev/dri/renderD128
    ports:
      - "8096:8096"
    volumes:
      - ./config:/config
      - ./cache:/cache
      - /path/to/media:/media:ro

For NVIDIA, install the NVIDIA Container Toolkit on the host first (NVIDIA's install guide covers each distribution), then add this to the same service in place of group_add and devices:

    runtime: nvidia
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]

Run docker compose up -d again after the change. AMD's AMF does not work in Windows Docker or WSL, according to Jellyfin's docs. On a NAS the steps differ a little; see Jellyfin on Unraid and Jellyfin on Synology.

Tip: the 8096:8096 line makes Jellyfin reachable on your home network only. Don't forward port 8096 on your router: it is plain HTTP, so passwords and everything you watch would cross the internet unencrypted. Jellyfin remote access covers the safe ways.

Check that it works

Start a video in a browser and, in the player's settings, choose a lower quality so Jellyfin has to convert it. Then look in three places.

  • The player. In the player's menu, Playback Info shows whether it is direct playing or transcoding, and the Reason for transcoding.
  • The GPU itself. On Windows, Task Manager's GPU graph shows the Video Decode and Video Encode engines working. On Linux, use intel_gpu_top for Intel, nvidia-smi for NVIDIA or radeontop for AMD.
  • The FFmpeg log. Under Dashboard > Logs, open the newest log whose name starts with FFmpeg.Transcode. Names like h264_qsv, hevc_nvenc, h264_amf, vaapi or videotoolbox mean the GPU is doing the work. Plain libx264 means the processor is.

Common failures

  • Every converted video fails at once. Usually a decoding format is ticked that the chip can't handle, or the driver is too old. Untick the newer formats one by one.
  • Docker logs say permission denied on /dev/dri. The group number is wrong or missing. Check it again on the host, not inside the container.
  • "Unknown runtime: nvidia". The NVIDIA Container Toolkit isn't installed or Docker wasn't restarted after installing it.
  • The GPU sits idle on some files. Jellyfin falls back to the processor for formats you didn't tick, and audio-only conversion never touches the GPU.
  • Picture looks soft on AMD. Jellyfin's docs note AMD's H.264 encoder has weaker quality because it lacks B-frames; letting it encode HEVC helps when your apps support it.
  • A low-end NVIDIA card does nothing. Some models, such as the GT 1030 and MX450, have no NVENC engine. Check NVIDIA's codec support matrix before buying.
  • A Mac with no screen slows down. Jellyfin's docs say a Mac without a built-in display may need a monitor connected to keep the GPU from throttling.

Hardware acceleration also speeds up scrubbing previews, which Jellyfin builds overnight; see scrubbing previews.

Questions

Is hardware transcoding free in Jellyfin?

Yes. It is part of Jellyfin, which is free and open source. There is no paid tier to unlock it.

Should I use QSV or VA-API for Intel on Linux?

Jellyfin's docs prefer QSV for Intel chips from 5th gen Core (Broadwell) onwards, and VA-API for older ones.

Does hardware transcoding look worse than the processor?

At the same bitrate a GPU encoder is a little less efficient than a slow processor encode. On a phone or a TV across the internet the difference is hard to see, and the GPU keeps playback smooth.

Why is Jellyfin still using the processor?

Direct play needs no conversion, audio conversion always runs on the processor, and any video format not ticked under hardware decoding is decoded in software.

The one-click way: Reelhost

Reelhost's Video speed check tests your graphics (Intel Quick Sync, NVIDIA NVENC or AMD AMF, or VideoToolbox on a Mac) with Jellyfin's own video tools on that computer. It turns on only the one that passed, with decoding for the formats that passed (H.264, HEVC, VP9); nothing untested is turned on. In Docker, give both containers the GPU and it turns on VA-API or NVENC. Applying it needs Core or higher; see what Video speed changes.

The check-up is free and changes nothing. Every fix is previewed, backed up and reversible.