diff --git a/jellyfin/readme.md b/jellyfin/readme.md index e9abbca..f54ed16 100644 --- a/jellyfin/readme.md +++ b/jellyfin/readme.md @@ -2,21 +2,207 @@ ###### guide-by-example -![logo](https://i.imgur.com/gSyMEvD.png) +![logo](https://i.imgur.com/5JEyoyF.png) + +![interfacepic](https://i.imgur.com/KKmcc7g.jpeg) # Purpose & Overview -Stream movies/tv-shows/music to a browser, or a [large selection of devices and services.](https://jellyfin.org/clients/) +Stream movies, shows, music to a phone, a TV, a browser, ...
+Something like your own Netflix. -* [Official site](https://jellyfin.org/) +* [The Official site](https://jellyfin.org/) * [Github](https://github.com/jellyfin/jellyfin) * [DockerHub](https://hub.docker.com/r/jellyfin/jellyfin/) -Jellyfin if a free media system, an alternative to proprietary Plex.
-The core server side is written in C#, web client in Javascript, -and a number of other clients written in various languages and frameworks. +Jellyfin is free and opensource without any limitation. -Starting point for me was [this viggy96 repo](https://github.com/viggy96/container_config) +The server can be installed on windows, or on linux or run as a docker container.
+It's written in C#, web client in Javascript +and a number of other [clients](https://jellyfin.org/clients/) written in +various languages and frameworks. + + +
+

Video - core concepts

+ +![encoding-pic](https://i.imgur.com/s2vQxG1.png) + +* a **video file** is a bunch of pictures - **frames**, + packed in to one file. +* To save disk space and bandwidth its **compressed** using a video standard/codec. + * **H.262** - also called MPEG-2 - stuff of the past + * **H.264** - the most common now, also called **AVC** or MPEG-4 + * **H.265** - also called **HEVC**, fast spreading, 50% improved over H.264,
+ but fees for it got more expensive with convoluted patent pools + * **AV1** - the future, no royalty fees, more improvements. + The successor to VP9, which was developed by google. +* Ways to transcode + * **Software** - cpu does the job, uses some library, it is **very cpu heavy**
+ a phone doing a software playback would either stutter, or be through + the entire battery in 30 minutes. + * **Hardware** - there is a dedicated hardware - `ASIC` - a tiny part + of a cpu/gpu/soc that is designed for just one thing - + to transcode a specific video standard. It is extremely efficient at it. +* `standard` vs `codec` + * **Video Compression Standard** - set of specifications to follow, like a recipe, + examples are H.264, H.265, AV1,.. + * **Codec** - The actual software or hardware implementation of a standard, + a cook that follows a recipe and gives you a finished meal. + Examples are `x264`, `x265`, `libaom`, or hardware ASICs on a gpu + or a cpu like nvidia `NVENC` or `intel quick sync`. +* Other terminology + * **Bitrate** - how much data per seconds flow, for example 2Mbps or 20Mbps,
+ higher bitrate means better quality and larger files/bandwidth needs + * **Decode** - taking a compressed video file and turning it into a viewable format. + * **Encode** - compressing raw video in to a specific video format + * **Transcode** - converting a video format in to a different format, + consists of both decode and encode steps + * **Direct Play** - No transcoding required. The device that is trying to play + the video is able to do so with its hardware. + * **HDR** - High Dynamic Range. A new technology to improve contrast and visible + details but lacks wide hardware support yet. + The opposite is SDR - Standard Dynamic Range. + * **ffmpeg** - a command line application, open source, + contains codec libraries to be a single tool for all video manipulation. + Is often the one under the hood of any media related software, doing the work. + +
+ +--- +--- + +
+

Jellyfin transcoding

+ +![jelly-transcoding-pic](https://i.imgur.com/9U1A02j.png) + +Jellyfin streams media files to client applications.
+In most cases it's **direct play**, no transcoding required and any machine +can do dozens of **concurent streams** in direct play. + +But there are cases **when a client does not support codec** of the video file.
+Example is Firefox playing a movie encoded in HEVC(x265).
+Jellyfin knows which codecs client supports and if needed +it **transcodes video on the fly**, as it's being streamed. + +Another reason can be if you set hard limit on upstream bandwith use.
+In `Dashboard` > `Playback` > `Streaming` setting lets say +[2Mbps.](https://i.imgur.com/7hSf4e1.png) + +Out of the box, jellyfin is set to **use cpu for software-cpu transcoding**. +It will work fine for one or two simple 1080p concurent streams, +unless the cpu is really underpowered/old. +In any case it can put [a heavy load](https://i.imgur.com/rjNFN1J.png) +on the CPU. + +### Hardware acceleration + +* [official docs](https://jellyfin.org/docs/general/administration/hardware-acceleration/) + +Ideally jellyfin is running on something that can offer hardware accelerated +transcoding, using iGPU which greatly improves performance and power consumption. + +* **Intel** - QSV - intel quicksync. Go-To recommendation and ideal for most users, + high quality, fast, reliable drivers, cheap and low power consumption as an igpu. + Most used so huge userbase. +* **AMD** - VAAPI when in docker - kinda shunned as historicly it had the worst + encode quality. [AMD improved some](https://youtu.be/H0pCpNT4b-Q), + but so did the competition so it's still not as good. But in real use + most people would likely not be able to tell difference.
+ AV1 encode supported by their newest stuff finally concludes the discussion + as it's praised for great quality. +* **nvidia** - NVENC - quality not as good as intel, but better than amd, + driver limit of 8 encoding sessions. Not an ideal solution as a pcie card will + consume some extra power. +* **Intel Arc** - QSV - relatively new hardware, should be great, + but be careful about idle power consumption, + some reviews post \~30W idle for arc while \~5W for amd/nvidia. + +But to repeat:
+Very likely majority of media will be in h.264 and h.265 and **overwhelming +majority of devices can play these straight up - direct play**. So no need to +overthink transcoding hardware much.
+That is unless you want to go 4K + HDR. + +### 4K and HDR + +![tonemapping](https://i.imgur.com/kAz2HkY.gif) + +With 4K resolution often comes **HDR** - High Dynamic Range.
+If its played on HDR device all is fine and theres better contrast and details. +But non-HDR devices need transcoding with tonemapping.
+**Tonemapping** is what converts HDR content to **SDR** - Standard Dynamic Range. +Without tonemapping the colors would be heavily desaturated - washed out. + +Some **clients**, like Findroid on android use mpv for playback, which somehow +deals with the HDR to SDR conversion on its own. +Might be better since its direct play, but might be worse because of putting load +on the device. + +### Testing various hardware + +Archlinux straight on metal, docker Jellyfin.
+Testing [10x FHD streams](https://i.imgur.com/nP71y0E.png), +and 4K+HDR+tonemapping till see stutter
+Testing by running movies, x265 encoded, in edge under linux.
+`Throttle Transcodes` is turned off so that the movie is transcoded in full, +not just 3min segments. + +Results + +* ryzen **7700X** + * 10x streams FHD - [pass](https://i.imgur.com/NAyfXmG.png) + * 4K+HDR+tonemapping - not tested +* intel **n200** + * 10x streams FHD - [pass](https://i.imgur.com/nP71y0E.png) + * 4K+HDR+tonemapping - not tested +* ryzen **8600G** + * 10x streams FHD - [pass](https://i.imgur.com/9R60Spw.png)
+ except [weird green artifacts](https://i.imgur.com/s4lSJRI.png) + for ~30sec when starting all 10 streams at once + * 4K+HDR+tonemapping - not tested + * AV1 encoding - [worked](https://i.imgur.com/ZaQRIAc.png) +* intel **i5-12600k** + * 10x streams FHD - [pass](https://i.imgur.com/BGXOeGS.png) + * 4K+HDR+tonemapping - 4 streams +* ryzen **4350GE** + * 10x streams FHD - 6 max, otherwise stutter + * 4K+HDR+tonemapping - 1x stream [barely](https://i.imgur.com/8iairvO.png) + + +Software used for monitoring the cpu and gpu usage + +* [btop](https://github.com/aristocratos/btop) +* `intel_gpu_top` from [intel-gpu-tools](https://archlinux.org/packages/extra/x86_64/intel-gpu-tools/) package +* `radeontop` from [radeontop](https://archlinux.org/packages/extra/x86_64/radeontop/) package + +
+ +--- +--- + +# Clients + +Jellyfin's open source nature allows developers to create unofficial client apps +for various platforms. + +* [Awesome Jellyfin Clients List](https://github.com/awesome-jellyfin/awesome-jellyfin/blob/main/CLIENTS.md) + +The ones I tried and find good to know about. + +### [Findroid](https://github.com/jarnedemeulemeester/findroid) + +Feels bit better in user interface and control.
+Does not jump subtitles like the official client, also seems its always directplay +even 4k+HDR, have to investigate how the fuck does it do. +Uses mpv, but does it mean theres some big load on a phone when compared +to the official app?
+It ignores max streaming bandwith limit when server streams over the internet. + +### [Finamp](https://github.com/jmshrv/finamp) + +Aimed for music. Did not tested much yet. # Files and directory structure @@ -45,14 +231,15 @@ Starting point for me was [this viggy96 repo](https://github.com/viggy96/contain You only need to provide the two files.
The directories are created by docker compose on the first run. -# compose +# Compose + +* [the official documentation](https://jellyfin.org/docs/general/installation/container) A relatively simple compose. The only atypical thing is the **passthrough** of the graphic card -for hardware accelerated transcoding.
-In the `devices` section a passthrough of a graphic card is done, -`/dev/dri/renderD128` refering to the first gpu of the system
+for hardware accelerated transcoding. +It's in the `devices` section `/dev/dri/renderD128`
In `group_add` section permissions are set. You want to execute the command: `getent group render | cut -d: -f3` to get the correct group number for you system and set it in. @@ -74,13 +261,14 @@ services: group_add: - "989" # match output of: getent group render | cut -d: -f3 volumes: - - ./jellyfin_config:/config - ./jellyfin_cache:/cache - - /mnt/bigdisk/serialy:/media/tv:ro + - ./jellyfin_config:/config + - /mnt/bigdisk/serialy:/media/shows:ro - /mnt/bigdisk/filmy_2:/media/movies:ro ports: - "8096:8096" # webGUI - "1900:1900/udp" # autodiscovery on local networks + - "7359:7359/udp" # autodiscovery on local networks networks: default: @@ -93,6 +281,11 @@ networks: # GENERAL DOCKER_MY_NETWORK=caddy_net TZ=Europe/Bratislava + +# JELLYFIN + +# url or ip address +JELLYFIN_PublishedServerUrl=https://tv.example.com ``` **All containers must be on the same network**.
@@ -116,133 +309,153 @@ tv.{$MY_DOMAIN} { # The first run - +Click through the basic setup. -Click through basic setup. - -WORK IN PROGRESS - -WORK IN PROGRESS - -WORK IN PROGRESS - -# Transcoding - -### The basics - -* a **video file** is just a bunch of pictures - **frames**, - somehow packed in to one file. -* To save up disk space and bandwidth its **compressed** using some video - standard/codec. - * MPEG-2 - stuff of the past - * **H.264** - the most common now - * **H.265** - also called **HEVC**, fast spreading, 50% improved over H.264 - * **AV1** - the future, open codec - no licencing fees, more improvements -* Ways to transcode - * **Software** - cpu does the job, uses some library, it is **very cpu heavy**
- a phone doing a software playback would either stutter, or be through - the entire battery in 30 minutes. - * **Hardware** - there is a dedicated hardware - a tiny part of a cpu/gpu/soc - that is designed for just one thing - to transcode a specific video standard. - That means it is **extremely efficient** at it. -* Terminology - * **Decode** - taking a compressed video file and turning it into a viewable format. - * **Encode** - compressing raw video in to a specific video format - * **Transcode** - converting a video format in to a different format, - consists of both decode and encode steps +* Change the server's name
+ `Dashboard` > `General` > `Server name` +* -Ideally you deploy jellyfin somewhere with an igpu to get hardware accelerated -transcoding, but it is far from required. -For most people, majority of media will be in H.264 or H.265 which will be -**direct play** - no transcoding required on most devices.
-Even if theres occasional need to transcode, average cpu can do one or two streams. +
+

Intel specific setup

-If you plan to serve more people and have larger library you should -definitly plan to have something with igpu +* [the official documentation](https://jellyfin.org/docs/general/administration/hardware-acceleration/intel/#configure-with-linux-virtualization) -#### HDR +Assuming an intel cpu with an igpu of the last \~8 years.
+The `compose.yml` + `.env` should just work. -The issue starts with 4k content, of which majority also uses -HDR - High Dynamic Range. This is for benefit of HDR TVs, monitors, phones,... -To play on non-HDR devices transcoding is always required and not just typical -transcoding, but also tonemapping as trancoding HDR content without it will make colors seem -heavily desaturated - washed out. +### Hardware Accelerated Transcoding. -* Not all devices like phones, PCs - browsers, TVs, streaming boxes,... - have build in support for all these standard. -* If video is in H.265 but firefox on linux cant decode it, - jellyfin detects this and transcodes it to something that can be played. +`Dashboard` > `Playback` > `Transcoding` -### intel igpu +* `Hardware acceleration` - **Intel QuickSync (QSV)** +* `QSV Device` - `/dev/dri/renderD128` +* `Enable hardware decoding for` + * Check everything **except** `AV1` and `HEVC RExt 12bit` + * if 12th gen+ check everything +* `Enable hardware encoding` - check +* `Enable VPP Tone mapping` - check +* `Enable Tone mapping` - check +* `Encoding preset` - `Auto` +* `Throttle Transcodes` - check +* `Delete segments` - check -to get "Enable Intel Low-Power H.264 hardware encoder" working +To be able to use `Enable Intel Low-Power H.264 hardware encoder` -* `echo "options i915 enable_guc=2" > /etc/modprobe.d/i915.conf` +* On the docker host
+ `echo "options i915 enable_guc=2" > /etc/modprobe.d/i915.conf` * `mkinitcpio -P` * reboot -The above compose basic setup worked for me +
-* ryzen 1700, headless, without any gpu -* modern intel cpus with igpu - n200, i5-125600k -* modern amd ryzens with igpu - 7700x, 5500GT +--- +--- -but how to setup things might change over time so one should check -[the official documentation](https://jellyfin.org/docs/general/administration/hardware-acceleration/intel#configure-with-linux-virtualization) +
+

AMD specific setup

+* [the official documentation](https://jellyfin.org/docs/general/administration/hardware-acceleration/amd#configure-with-linux-virtualization) +* [some videos](https://youtu.be/H0pCpNT4b-Q) with [some takes](https://youtu.be/UNJLDS5gC7o) + on [AMD transcoding](https://youtu.be/pnvp9DtqVjo) +Assuming an amd cpu with vega or RDNA.
+The `compose.yml` + `.env` should just work. -# Specifics of my setup +`Dashboard` > `Playback` > `Transcoding` -* no real long term use -* findroid app does not jump subtitles like official one -* amd cpu and no gpu, so no experience with hw transcoding -* media files are stored and shared on trunas scale VM - and mounted directly on the docker host using [systemd mounts](https://forum.manjaro.org/t/root-tip-systemd-mount-unit-samples/1191), - instead of fstab or autofs. +* `Hardware acceleration` - **Video Acceleration API (VAAPI)** +* `QSV Device` - `/dev/dri/renderD128` +* `Enable hardware decoding for` + * Check everything **except** `AV1` and `HEVC RExt 12bit` + * if 7000+ check everything +* `Enable hardware encoding` - check + * `Allow encoding in AV1 format` - check if 8000G+ +* `Enable Tone mapping` - check, but needs work +* `Encoding preset` - `Auto` +* `Throttle Transcodes` - check +* `Delete segments` - check - `/etc/systemd/system/mnt-bigdisk.mount` - ```ini - [Unit] - Description=12TB truenas mount +Tone mapping - [Mount] - What=//10.0.19.11/Dataset-01 - Where=/mnt/bigdisk - Type=cifs - Options=ro,username=ja,password=qq,file_mode=0700,dir_mode=0700,uid=1000 - DirectoryMode=0700 +* for my arch host installing these packages +* `sudo pacman -S xf86-video-amdgpu libva-mesa-driver mesa-vdpau vulkan-radeon vulkan-tools` +* reboot - [Install] - WantedBy=multi-user.target - ``` +
- `/etc/systemd/system/mnt-bigdisk.automount` - ```ini - [Unit] - Description=12TB truenas mount +--- +--- - [Automount] - Where=/mnt/bigdisk +
+

Mounting network shares

- [Install] - WantedBy=multi-user.target - ``` +If the media files are stored and an smb share and should be mounted directly +on the docker host using [systemd mounts](https://forum.manjaro.org/t/root-tip-systemd-mount-unit-samples/1191), +instead of fstab or autofs. - to automount on boot - `sudo systemctl enable mnt-bigdisk.automount` +`/etc/systemd/system/mnt-bigdisk.mount` +```ini +[Unit] +Description=12TB truenas mount + +[Mount] +What=//10.0.19.11/Dataset-01 +Where=/mnt/bigdisk +Type=cifs +Options=ro,username=ja,password=qq,file_mode=0700,dir_mode=0700,uid=1000 +DirectoryMode=0700 + +[Install] +WantedBy=multi-user.target +``` + +`/etc/systemd/system/mnt-bigdisk.automount` +```ini +[Unit] +Description=12TB truenas mount + +[Automount] +Where=/mnt/bigdisk + +[Install] +WantedBy=multi-user.target +``` + +to automount on boot - `sudo systemctl enable mnt-bigdisk.automount` + +
+ +--- +--- # Troubleshooting +#### Playback failed due to a fatal player error + +![playback_error](https://i.imgur.com/aEjFvra.png) + +* docker host - go to `jellyfin/jellyfin_config/log/` +* the last file in the folder is the last playback attempt +* paste that output in to chatgpt + +#### Autodiscovery not working + +to check if autodiscovery port is open and server is responding: + +* `echo -n 'Who is JellyfinServer?' | nc -u -b 10.0.19.4 7359` + ![error-pic](https://i.imgur.com/KQhmZTQ.png) +#### Unable to connect to the selected server right now + *We're unable to connect to the selected server right now. Please ensure it is running and try again.* -If you encounter this, try opening the url in browsers private window.
-If it works then clear the cookies in your browser. +* try opening the url in browsers private window +* if that works then clear the cookies in your browser -*No playback at all but GUI works fine* +#### No playback at all but GUI works fine Might be no access to network share, for example if dockerhost boots up faster than NAS.