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