Skip to main content

Jellyfin Transcoding

Understanding when Jellyfin transcodes and how to optimize.

Verification Status​

FieldValue
Last verified2026-01-28
Jellyfin versionlatest (Docker)
GPURTX 4090 (NVENC, driver 580.95)

Decision Tree​

Client requests playback
│
▼
Container supported?
│
┌────┴────┐
No Yes
│ │
▼ ▼
Remux Video codec supported?
│
┌────┴────┐
No Yes
│ │
▼ ▼
Transcode Audio codec supported?
Video
│
┌────┴────┐
No Yes
│ │
▼ ▼
Transcode Subtitles burn-in required?
Audio
│
┌────┴────┐
Yes No
│ │
▼ ▼
Transcode Direct Play
Video

Transcode Triggers​

Video (High Cost)​

TriggerResolution
HEVC on unsupported clienth264 encode or HEVC-capable client
Resolution exceeds clientClient setting or lower-res encode
HDR on SDR displayTone-mapping transcode (expensive)
Bitrate limitRaise limit or lower-bitrate encode

Audio (Low Cost)​

TriggerResolution
TrueHD/DTS-HD unsupportedStereo transcode acceptable
Channel countStereo mixdown acceptable

Subtitles (Triggers Video Transcode)​

TypeBehavior
SRTDelivered separately, no transcode
ASS/SSABurned in = video transcode
PGS/VOBSUBBurned in = video transcode

Resolution: Convert image-based subtitles to SRT.


Hardware Transcoding​

NVIDIA​

services:
jellyfin:
image: jellyfin/jellyfin
runtime: nvidia
environment:
- NVIDIA_VISIBLE_DEVICES=all
devices:
- /dev/dri:/dev/dri

Dashboard → Playback → Transcoding:

  • Hardware acceleration: NVIDIA NVENC
  • Enable decoding: H264, HEVC, VP9, AV1 (if supported)
  • Enable encoding

Verification​

nvidia-smi # Should show jellyfin process during transcode

Client Compatibility​

ClientDirect Play Support
Jellyfin Media PlayerExcellent
Web browserLimited (no HEVC)
RokuGood
Apple TVGood (MKV remux)
ChromecastLimited

Optimization Priority​

  1. Direct Play — Zero load
  2. Direct Stream (Remux) — Minimal load
  3. Audio transcode — Light load
  4. Video transcode (HW) — Moderate load
  5. Video transcode (SW) — Heavy load

Revision History​

DateChange
—Initial document