Jellyfin gives you a private, Netflix-style library for your own movies, shows, and music, with no subscriptions and no tracking. Ubuntu Server is one of the best homes for it. The install itself is quick. The part that frustrates almost everyone comes later: you play a 4K film, the CPU spikes to 100 percent, playback stutters, and hardware transcoding — which should be doing the heavy lifting quietly on the GPU — is clearly not working.
Quick Answer
Install Jellyfin on Ubuntu Server from the official Jellyfin repository, then enable hardware acceleration in Dashboard, Playback, Transcoding by selecting Intel Quick Sync or VAAPI. Hardware transcoding usually fails because the jellyfin user is not in the render and video groups, or because the server has no access to the GPU device at /dev/dri. Add the user to those groups, restart Jellyfin, and test again.
What You Need Before You Start
- Ubuntu Server 22.04 or 24.04, updated, with a user who can use
sudo. - A CPU with integrated graphics for Quick Sync, or a supported GPU, if you want hardware transcoding. Jellyfin runs fine without one, but 4K transcoding will struggle.
- Your media stored in tidy folders, for example
/media/moviesand/media/tv, readable by the Jellyfin service. - A static IP or reserved address for the server, so you can always reach it at the same place.
Step 1: Install Jellyfin from the Official Repository
Always use the official repository rather than random packages, so you receive updates with your normal system updates. The official Jellyfin Linux installation documentation provides the supported method, summarised here:
- Update the server and install the tools the setup needs:
sudo apt update && sudo apt install -y curl gnupg. - Run the official repository setup script provided by the Jellyfin team:
curl https://repo.jellyfin.org/install-debuntu.sh | sudo bash. This adds the Jellyfin repository and its signing key. - Alternatively, add the repository manually following the official docs if you prefer to review every step yourself.
- Install the server:
sudo apt install -y jellyfin. - Confirm the service is running:
sudo systemctl status jellyfin. It should show as active and enabled at boot.
Step 2: Complete the First-Time Setup
- From another device on your network, open
http://YOUR-SERVER-IP:8096in a browser. - Create the administrator account with a strong password.
- Add your libraries. Choose Movies for the movies folder and Shows for the TV folder, and let Jellyfin download metadata.
- Finish the wizard, sign in, and play a short file as a basic test before changing any advanced settings.
If the page does not load, check the service status again and make sure no firewall is blocking port 8096. On a simple home server, sudo ufw allow 8096 is enough if UFW is enabled. For a broader walkthrough of securing a home server after install, see our guide on securing a Linux home server with a simple checklist.
Step 3: Understand Why Transcoding Matters
Transcoding means converting a video on the fly into a format or bitrate the playing device can handle. A phone on mobile data, an old smart TV, or a browser may not play your original file directly. Without hardware help, the CPU does this conversion in software, which is slow and hot. With hardware acceleration, the GPU does it efficiently, and several streams can play at once.
Direct Play is always best. If your device supports the file, Jellyfin sends it unchanged and transcoding never happens. Hardware transcoding is your safety net for everything else.
Step 4: Enable Hardware Transcoding
- Open the Jellyfin Dashboard, then go to Playback and open the Transcoding section.
- Under Hardware Acceleration, choose the option that matches your hardware: Intel Quick Sync (QSV) for most Intel integrated graphics, Video Acceleration API (VAAPI) as a solid general choice on Linux, or NVIDIA NVENC for an NVIDIA card.
- Tick the formats your hardware supports, such as H.264, HEVC, and VP9 decoding where offered.
- Enable hardware encoding as well, and consider enabling HEVC encoding only if your GPU supports it.
- Save the settings.
Step 5: Fix Hardware Transcoding When It Is Not Working
This is the step most guides rush. Work through these checks in order, because the first one fixes the majority of cases.
Check 1: Give Jellyfin Permission to Use the GPU
On Ubuntu, the GPU render device is restricted. Check that it exists:
ls -l /dev/dri
You should see entries such as card0 and renderD128. Now add the Jellyfin service user to the required groups:
sudo usermod -aG render,video jellyfin
Restart the service so it picks up the new groups: sudo systemctl restart jellyfin. This single fix resolves the classic symptom where transcoding falls back to CPU or fails with errors in the log.
Check 2: Install the Intel Media Drivers
For Intel graphics, install the VAAPI driver: sudo apt install -y intel-media-va-driver-non-free vainfo. Then run vainfo and confirm it lists supported profiles instead of an error. For newer Intel hardware this driver is essential; the older i965 driver does not cover recent generations well.
Check 3: Read the FFmpeg Log
In the Dashboard, open Logs and look at the most recent ffmpeg.transcode log after a failed or slow playback. Search it for words like error, permission, or No such device. The log states plainly whether Jellyfin even attempted hardware acceleration and why it gave up.
Check 4: Confirm the Right Acceleration Type
QSV selected on a machine without Intel graphics, or NVENC selected without NVIDIA drivers, guarantees failure. Match the setting to the real hardware, and when in doubt on Intel systems, VAAPI is the forgiving choice.
Check 5: Rule Out the Client
Play the same file in the Jellyfin web player and in a native app. During playback, open the Dashboard and check the session: it will say Direct Play, Direct Stream, or Transcode, and whether hardware is being used. A file that direct-plays everywhere never needed transcoding in the first place.
Common Mistakes and Useful Tips
- Forgetting to restart Jellyfin after group changes: Group membership only applies to new processes. Always restart the service.
- Running Jellyfin in a virtual machine without GPU passthrough: The guest cannot use a GPU it cannot see. Bare metal or proper passthrough is required.
- Testing with a file that direct-plays: Force a real test by lowering the playback quality in the client, which triggers a transcode.
- Ignoring tone mapping for HDR files: HDR to SDR transcoding needs extra support. Enable tone mapping options in the transcoding settings for 4K HDR libraries.
- Media permissions mixed with GPU problems: If files will not play at all, check folder permissions first; that is a separate fault from transcoding.
Conclusion
Installing Jellyfin on Ubuntu Server takes minutes with the official repository, and the setup wizard handles the rest. The real craft is in the transcoding settings: pick the acceleration type that matches your hardware, install the correct Intel driver if needed, and above all make sure the jellyfin user belongs to the render and video groups so it can actually reach the GPU. Work through the checks in order, confirm with the FFmpeg log, and your server will transcode quietly in hardware instead of cooking its CPU.
Frequently Asked Questions
How do I know if hardware transcoding is working?
Start a stream that needs transcoding, then check the Dashboard session details and the server CPU usage. With hardware transcoding active, CPU usage stays modest and the FFmpeg log references the hardware device.
Which is better for Intel CPUs, QSV or VAAPI?
Quick Sync usually gives the best quality and feature support on Intel hardware. VAAPI is a reliable fallback and works well when QSV misbehaves on a particular driver version.
Do I need a Jellyfin or Plex subscription for hardware transcoding?
No. Hardware transcoding in Jellyfin is completely free, with no pass or subscription required. That is one of its biggest advantages.
Why is /dev/dri missing on my server?
The GPU is either disabled in the BIOS, not passed through to a virtual machine, or the kernel driver failed to load. Check BIOS settings and the output of lspci | grep -i vga.
Can one small server handle several 4K transcodes?
With working Quick Sync on a reasonably modern Intel CPU, yes, several simultaneous hardware transcodes are realistic. In software on CPU alone, even one 4K transcode can be too much.


Leave a Reply