Codec Tables
The goal is to Direct Play all media. This means the container, video, audio and subtitles are all compatible with the client. If the media is incompatible for any reason, Jellyfin will use FFmpeg to convert the media to a format that the client can process. Direct Stream will occur if the audio, container or subtitles happen to not be supported. If the video codec is unsupported, this will result in video transcoding. Subtitles can be tricky because they can cause Direct Stream (subtitles are remuxed) or video transcoding (burning in subtitles) to occur. This is the most intensive CPU component of transcoding. Decoding is less intensive than encoding.
Video Compatibility
Test your browser's compatibility for any codec profile.
Sorted by efficiency (excluding bit depth) | Chrome | Edge | Firefox | Safari | Android | Android TV | iOS | SwiftFin (iOS) | Roku | Kodi | Desktop |
---|---|---|---|---|---|---|---|---|---|---|---|
MPEG-4 Part 2/SP | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ |
MPEG-4 Part 2/ASP | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | |
H.264 8Bit | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
H.264 10Bit | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ | ✅ |
H.265 8Bit | ❌ | ✅7 | ❌ | 🔶1 | 🔶2 | ✅5 | 🔶1 | ✅6 | ✅ | ✅ | ✅ |
H.265 10Bit | ❌ | ✅7 | ❌ | 🔶1 | 🔶2 | 🔶5 | 🔶1 | ✅6 | ✅ | ✅ | ✅ |
VP9 | ✅ | ✅ | ✅ | ❌ | ✅3 | 🔶3 | ❌ | ❌ | ✅ | ✅ | ✅ |
AV1 | ✅ | ✅ | ✅ | ❌ | ✅ | 🔶4 | ❌ | ❌ | ✅ | ✅ | ✅ |
MPEG-2 Part 2 | MPEG-4 Part-21 | MPEG-4 Part-10 | MPEG-4 Part-14 | MPEG-H Part 2 |
---|---|---|---|---|
H.262 | MPEG-4 SP/ASP | H.264 | MP4 Container2 | H.265 |
MPEG-2 Video | DivX | MPEG-4 AVC | HEVC | |
DVD-Video | DX50 |
Audio Compatibility
If the audio codec is unsupported or incompatible (such as playing a 5.1 channel stream on a stereo device), the audio codec must be transcoded. This is not nearly as intensive as video transcoding.
Chrome | Edge | Firefox | Safari | Android | Android TV | iOS | SwiftFin (iOS) | Roku | Kodi | Desktop | |
---|---|---|---|---|---|---|---|---|---|---|---|
FLAC | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
MP3 | 🔶1 | ✅ | 🔶 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
AAC | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
AC3 | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |
EAC32 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |
VORBIS3 | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ |
DTS4 | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ | ✅ | ✅6 | ✅ | ✅ |
OPUS | ✅ | ✅ | ✅ | 🔶5 | ✅ | ✅ | 🔶5 | ✅ | ✅ | ✅ | ✅ |
MPEG-1 | MPEG-2 |
---|---|
MP2 (layer 2) | AAC (Part 7) |
MP3 (layer 3) |
ATSC Standard for AC-3 and EAC-3.
Subtitle Compatibility
Subtitles can be a subtle issue for transcoding. Containers have a limited number of subtitles that are supported. If subtitles need to be transcoded, it will happen one of two ways: they can be converted into another format that is supported, or burned into the video due to the subtitle transcoding not being supported. Burning in subtitles is the most intensive method of transcoding. This is due to two transcodings happening at once; applying the subtitle layer on top of the video layer.
Here is a breakdown of common subtitle formats.
Format | TS | MP4 | MKV | AVI | |
---|---|---|---|---|---|
SubRip Text (SRT) | Text | ❌ | 🔶 | ✅ | 🔶 |
WebVTT (VTT)1 | Text | ❌ | ❌ | ✅ | 🔶 |
ASS/SSA | Formatted Text | ❌ | ❌ | ✅ | 🔶 |
VobSub2 | Picture | ✅ | ✅ | ✅ | 🔶 |
MP4TT/TXTT | XML | ❌ | ✅ | ❌ | ❌ |
PGSSUB | Picture | ❌ | ❌ | ✅ | ❌ |
EIA-608/7083 | Embedded | ✅ | ✅ | ✅ | ❌ |
Types of Subtitles
There are many variations of subtitles. Closed, open, burned-in, forced, SDH, and CC are among the common types of subtitles. The format (such as SubRIP or VobSUB) does not matter for the type of subtitle.
Closed Subtitles
This is the generic name for subtitles that can be turned on or off. This can be Forced, SDH, CC or normal subtitles.
Burned-in
Open subtitles (also known as burned-in subtitles) are subtitles that have been permanently placed in the video and cannot be turned off. Open subtitles are the most common type of subtitles, where the subtitles are part of the video stream and cannot be toggled on or off.
SDH and Closed Captioning
SDH and CC are subtitles for the Deaf and Hard of Hearing. They include extra content such as background noises. SDH and CC are not defined by a specific type of subtitle, just by their intent. If using an OTA Tuner and DVR, the subtitles will be embedded into the video and transcoding them before extracting the subtitles will destroy the subtitles.
Forced
"Forced subtitles are common on movies and only provide subtitles when the characters speak a foreign or alien language, or a sign, flag, or other text in a scene is not translated in the localization and dubbing process. In some cases, foreign dialogue may be left untranslated if the movie is meant to be seen from the point of view of a particular character who does not speak the language in question." - Wikipedia
Extracting Subtitles
To extract subtitles, the following commands can be used. The section 0:s:0
means the first subtitle, so 0:s:1
would be the second subtitle.
SSA/ASS Subtitles
ffmpeg -dump_attachment:t "" -i file.mkv -map 0:s:1 -c:s ass extracted-subtitle.ass
Recorded OTA Content
Content recorded OTA will typically have subtitles embedded into the video codec itself. These subtitles are typically EIA-608 for analog and EIA-708 for digital.
ffmpeg -f lavfi -i "movie=Ronin (1998).ts[out+subcc]" -map 0:1 "Ronin (1998).srt"
Container Compatibility
If the container is unsupported, this will result in remuxing. The video and audio codec will remain intact but wrapped in a supported container. This is the least intensive process. Most video containers will be remuxed to use the HLS streaming protocol and TS containers. Remuxing shouldn't be a concern even for an RPi3.
Chrome | Edge | Firefox | Safari | Android | Android TV | Kodi | Roku | |
---|---|---|---|---|---|---|---|---|
MP41 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
MKV2, 3 | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ |
WebM3, 5 | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ |
TS4 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
OGG5 | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ |