jellyfin 相关
记录 jellyfin 相关使用
jellyfin 安装--docker¶
参考:Container | Jellyfin 三个不同镜像源:
- Official container image:
jellyfin/jellyfin
.
- LinuxServer.io image:
linuxserver/jellyfin
.
- hotio image:
hotio/jellyfin
.
查看它们的 Dockerfile,可以看到安装了不同显卡的驱动,包含 va-api,opencl。
gpu 转码硬件加速¶
dev/dri¶
默认已经设置好用户权限了
docker-compose 中设置
root@689728fac458:/# l -alh /dev/dri
total 0
drwxr-xr-x 2 root root 80 Sep 29 19:41 ./
drwxr-xr-x 6 root root 360 Sep 29 19:41 ../
crw-rw---- 1 root video 226, 0 Sep 29 19:41 card0
crw-rw---- 1 root videoGaFCwCBc 226, 128 Sep 29 19:41 renderD128
root@689728fac458:/# id 1000
uid=1000(abc) gid=1000(abc) groups=1000(abc),44(video),100(users),104(videoGaFCwCBc)
root@689728fac458:/#
nvidia gpu¶
version: '3'
services:
jellyfin:
image: jellyfin/jellyfin
user: 1000:1000
network_mode: 'host'
volumes:
- /path/to/config:/config
- /path/to/cache:/cache
- /path/to/media:/media
runtime: nvidia
deploy:
resources:
reservations:
devices:
- capabilities: [gpu]
Installing the NVIDIA Container Toolkit — container-toolkit 1.14.1 documentation
linux 迁移到 docker¶
version: '3'
services:
jellyfin:
image: jellyfin/jellyfin
user: <uid>:<gid>
network_mode: 'host'
restart: 'unless-stopped'
environment:
- JELLYFIN_CACHE_DIR=/var/cache/jellyfin
- JELLYFIN_CONFIG_DIR=/etc/jellyfin
- JELLYFIN_DATA_DIR=/var/lib/jellyfin
- JELLYFIN_LOG_DIR=/var/log/jellyfin
volumes:
- /etc/jellyfin:/etc/jellyfin
- /var/cache/jellyfin:/var/cache/jellyfin
- /var/lib/jellyfin:/var/lib/jellyfin
- /var/log/jellyfin:/var/log/jellyfin
- <path-to-media>:<path-to-media>
需要备份数据包含 4 部分
- /var/lib/docker/docker_data/jellyfin/cache:/var/cache/jellyfin
- /var/lib/docker/docker_data/jellyfin/log:/var/log/jellyfin
- /var/lib/docker/docker_data/jellyfin/data:/var/lib/jellyfin
- /var/lib/docker/docker_data/jellyfin/etc:/etc/jellyfin
jellyfin 设置¶
一些经验
- 改变 jellyfin 转码设置,是立即生效的,无需重启 docker
- 实测 RX550 的薄弱 GPU 性能,勾选 HEVC 10bit 解码,反而会拖累编码过程,帧数更低。
设置/首页
- 可以调整媒体库显示顺序
- 可以将不同媒体库组合成一个显示
设置/播放
- 音频选择:播放默认音频
- 家庭网络质量:设置默认的串流码率,如 20Mbps
- 优先使用 fMP4-HLS 媒体容器:不知道如何生效
优先使用 fMP4 作为 HLS 播放的默认容器,从而可以在支持的设备上直接串流 HEVC 格式的内容
字幕
- 字幕偏好:偏好字幕,下面字幕模式需要使用
- 字幕模式:推荐设置为总是显示
- 智能:音频为外语时,加载偏好字幕,否则无字幕。不太适用,因为:1 多音频时无效,2 即使是中文视频,最好也有字幕
- 总是显示:显示偏好字幕。适用性最好,当有偏好字幕时会选择偏好,没有时选择默认。
- 默认:根据元数据中“默认”,“强制”来显示字幕。可以看作总是显示的子集
- 强制:根据元数据中“强制”来显示字幕
- 无字幕
- 是否烧录字幕
- 自动:图片格式或复杂 ass/ssa 字幕(客户端可能不支持显示)
p.s 建议以后支持一种更灵活的设置方法:无字幕,音频匹配偏好则无字幕,偏好字幕,默认,强制。通过调节这几个选项的顺序来实现不同策略
jellyfin 硬件加速¶
参考:Hardware Acceleration | Jellyfin
Jellyfin supports hardware acceleration (HWA) of video encoding/decoding using FFMpeg. FFMpeg and Jellyfin can support multiple hardware acceleration implementations such as Intel Quicksync (QSV), AMD AMF and NVIDIA NVENC/NVDEC through Video Acceleration APIs.
基础知识¶
常见视频编码¶
- H.264/h264/AVC
- Profile: High 10 = H.264 10bit:目前没有硬件支持 h264 10bit 解码
- H.265/HEVC
- Profile: Main, Main 10
浏览器支持的编码¶
不同硬件支持¶
不同显卡对应支持的硬件编解码 API:
- NVIDIA: NVENC
- AMD: AMF, VA-API
- Intel: QSV, VA-API
- Apple: VideoToolbox
- RPi: V4L2
不同方案参考: CPU 编解码:h265 -> h264 GPU 编解码:h265 -> GPU -> 中间帧 -> GPU -> h254 CPU 解码,GPU 编码:h265 10bit -> CPU -> 中间帧 -> GPU -> h254
测试方法¶
调试时,可以从 jellyfin 日志中把命令复制下来,来快速判断是否可以工作正常。
- vaapi 测试
# Check the QSV and VA-API codecs
docker exec -it jellyfin /usr/lib/jellyfin-ffmpeg/vainfo
# Check the OpenCL runtime status
docker exec -it jellyfin /usr/lib/jellyfin-ffmpeg/ffmpeg -v verbose -init_hw_device vaapi=va -init_hw_device opencl@va
调用 VA-API 失败(/dev/dri/renderD128 权限错误导致)
[AVHWDeviceContext @ 0x557d76500880] No VA display found for device /dev/dri/renderD128.
Device creation failed: -22.
Failed to set value 'vaapi=va:/dev/dri/renderD128' for option 'init_hw_device': Invalid argument
Error parsing global options: Invalid argument
OpenCL 设备没找到(开启 tone-mapping 后,amd gpu 需要安装 opencl 驱动)
[AVHWDeviceContext @ 0x56158f868900] No matching devices found.
Device creation failed: -19.
Failed to set value 'opencl=ocl:0.0' for option 'init_hw_device': No such device
Error parsing global options: No such device
intel 核显¶
- 转码:QSV, VA-API
- HDR tonne mapping:QSV, OpenCL
vainfo 查看 QSV 和 VA-API 支持情况
iHD driver
indicates support for the QSV and VA-API interfaces.i965 driver
indicates only support for the VA-API interface, which should only be used on pre-Broadwell platforms.
root@689728fac458:/# /usr/lib/jellyfin-ffmpeg/vainfo --display drm --device /dev/dri/renderD128
Trying display: drm
libva info: VA-API version 1.19.0
libva info: Trying to open /usr/lib/jellyfin-ffmpeg/lib/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_19
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.19 (libva 2.19.0)
vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 23.3.2 (95dc859)
vainfo: Supported profile and entrypoints
VAProfileNone : VAEntrypointVideoProc
VAProfileNone : VAEntrypointStats
VAProfileMPEG2Simple : VAEntrypointVLD
VAProfileMPEG2Main : VAEntrypointVLD
VAProfileH264Main : VAEntrypointVLD
VAProfileH264Main : VAEntrypointEncSliceLP
VAProfileH264High : VAEntrypointVLD
VAProfileH264High : VAEntrypointEncSliceLP
VAProfileVC1Simple : VAEntrypointVLD
VAProfileVC1Main : VAEntrypointVLD
VAProfileVC1Advanced : VAEntrypointVLD
VAProfileJPEGBaseline : VAEntrypointVLD
VAProfileJPEGBaseline : VAEntrypointEncPicture
VAProfileH264ConstrainedBaseline: VAEntrypointVLD
VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP
VAProfileVP8Version0_3 : VAEntrypointVLD
VAProfileHEVCMain : VAEntrypointVLD
VAProfileHEVCMain : VAEntrypointEncSliceLP
VAProfileHEVCMain10 : VAEntrypointVLD
VAProfileHEVCMain10 : VAEntrypointEncSliceLP
VAProfileVP9Profile0 : VAEntrypointVLD
VAProfileVP9Profile0 : VAEntrypointEncSliceLP
VAProfileVP9Profile1 : VAEntrypointVLD
VAProfileVP9Profile1 : VAEntrypointEncSliceLP
VAProfileVP9Profile2 : VAEntrypointVLD
VAProfileVP9Profile2 : VAEntrypointEncSliceLP
VAProfileVP9Profile3 : VAEntrypointVLD
VAProfileVP9Profile3 : VAEntrypointEncSliceLP
VAProfileHEVCMain422_10 : VAEntrypointVLD
VAProfileHEVCMain444 : VAEntrypointVLD
VAProfileHEVCMain444 : VAEntrypointEncSliceLP
VAProfileHEVCMain444_10 : VAEntrypointVLD
VAProfileHEVCMain444_10 : VAEntrypointEncSliceLP
其它选项¶
反交错时使帧率翻倍
此设置使用去隔行时的场频,通常称为 Bob 去隔行,它将视频的帧频加倍,以提供完整的运动效果,就像在电视上观看隔行视频时看到的那样。
允许实时提取字幕:建议关闭
为避免视频转码,可以从视频中提取内置的字幕,并以纯文本的形式发送给客户端。在某些系统中这个提取的进程可能会花费较长时间并导致视频播放出现卡顿。如果禁用这个选项,当内置字幕不能被客户端设备原生支持时,字幕将通过视频转码被烧录进视频中。
- 不明白其中内置字幕不能被客户端支持是什么意思。但是如果开启改选项,阿里云的视频播放过程无法显示字幕(提取速度太慢),一直显示提取元数据
- 据说还可能导致:播放 nas 视频且视频很大时,需要把视频读取一遍,导致会卡很长一段时间才能开始播放
限制转码速度:建议开启
当转码或者再封装的进度距离当前播放进度足够远时,暂停这个过程以减少资源消耗。当观看视频时不经常调整播放进度的情况下,这个功能将非常有用。如果你遇到了播放问题,请关闭这个选项。
启用备用字体:解决中文字幕显示方框问题
使用自定义的备用字体。这可以避免一些字幕渲染不正确的问题。
遇到的问题¶
开启 va-api 加速后,播放报错¶
设置硬件加速 vaapi,但是播放显式不兼容的格式弹窗,通过查看 ffmpeg log,可以看到
[AVHWDeviceContext @ 0x562f58a85d40] No VA display found for device /dev/dri/renderD128.
Device creation failed: -22.
Failed to set value '/dev/dri/renderD128' for option 'vaapi_device': Invalid argument
Error parsing global options: Invalid argument
均是由于/dev/dri 权限设置问题导致的,可以通过 group-add 参数解决。
With the newer releases, you can the group-add docker parameter to get around the issue of /dev/dri/renderD128 needing "render" group membership in Ubuntu. If you use docker run, you can use the group name instead of the number(
--group-add=render
). In my /etc/group file, the group number for the render group is 122.
- docker
- docker run:
--group-add="122"
- docker-compose:
group_add: "122"
- docker run:
- lxc 需要设置 gpu 设备 gid
参考:
- 相同问题:Incorrect permissions for /dev/dri · Issue #207
- 相同问题:Hardware acceleration isn't working properly · Issue #26
- linuxserver docker 中的解决方法:Incorrect permissions for /dev/dri · Issue #207
- docker user permission for transcoding · Issue #2281 · jellyfin/jellyfin · GitHub
字幕乱码¶
中文字幕显示方框,需要设置备用字体。 在备用字体目录下放置字体 ttf 文件,框框消失。
root@ubuntu20 ➜ conf.d l /fonts
total 24M
-rw-rw-rw- 1 jellyfin jellyfin 12M Oct 8 2021 FZFSK.TTF
-rw-rw-rw- 1 jellyfin jellyfin 9.5M Nov 28 2017 FZHTK.TTF
-rw-rw-rw- 1 jellyfin jellyfin 14M Dec 21 2017 FZKTK.TTF
-rw-rw-rw- 1 jellyfin jellyfin 9.5M Nov 28 2017 FZSSK.TTF
控制台 -> 播放 -> 备用字体
开启 HDR 色调映射后播放视频报错¶
不同显卡对于色调映射的支持是不同的
- intel:VPP 色调映射,和基于 Opencl 和 Cuda 的色调映射
- nvidia:Cuda
- amd:opencl
测试视频
- 刀剑神域无夜星的咏叹调:4K HEVC SDR
- 你的名字 2160p:4K HEVC HDR
- 小黄人:4K HEVC HDR
媒体库中文框框¶
UPDATE:这个在新版 docker 镜像中可能已经修复,没遇到过该问题。
虽然字幕已经解决了,但是 system 的 font 并不会使用 Chinese library names are displayed as square · Issue #5636 · jellyfin/jellyfin (github.com)
映射系统字体
jellyfin:
volumes:
- /usr/share/fonts:/usr/share/fonts
- /usr/share/fontconfig:/usr/share/fontconfig
syncplay 不工作¶
本地的 jellyfin 通过 nginx 反向代理,在公网提供服务。
nginx 反向代理导致 syncplay 不工作(添加到 group 后没有任何反映)Syncplay: how to? : r/jellyfin (reddit.com)
问题出在 nginx 没有代理 websocket,使用官方提供的 nginx 配置文件即可。 Nginx | Jellyfin
copy stream url¶
可以用于 vrchat 等 video player。 但是有泄露 session 的风险,有人提出是否要修复
- logout 后就失效了 Refactor "Copy Stream URL" to not leak the user's session API key · Issue #10808 · jellyfin/jellyfin (github.com)
直接播放 h265 的方法¶
windows、linux、mac 客户端:jellyfin-mpv-shim · PyPI
- 利用 jellyfin 的投屏功能,将浏览器的播放转移到客户端上,任意格式不用转码
显卡硬件转码 datasheet¶
Video Encode and Decode GPU Support Matrix | NVIDIA Developer nVidia Hardware Transcoding Calculator for Plex Estimates (elpamsoft.com)
无法扫描出视频¶
原来 movie 格式内容
添加的根路径(如 /MediaLib/Disk1/WebDL/Jellyfin
)下面可以有若干级子目录
但是每个子目录同级不能有其它视频文件,否则就不会扫描子目录,日志也看不出东西。
其他¶
mpv-shim¶
避免需要转码,对于动漫,可以安装插件,实现实时插帧,和超分。搜索 mpv 相关插件
归档¶
tmm 中文乱码
UDPATE:不再使用 tmm 了。
wget https://mirrors.aliyun.com/alpine/edge/testing/x86_64/font-wqy-zenhei-0.9.45-r2.apk
apk add --allow-untrusted font-wqy-zenhei-0.9.45-r2.apk
但是修改了 compose,会删除原本容器,因此需要重新设置。 永久办法,修改为第三方 docker 镜像dzhuang/tinymediamanager-docker: A repository for creating a docker container including TinyMediaManager with GUI interface. (github.com)