跳转至

jellyfin 相关

记录 jellyfin 相关使用

jellyfin 安装--docker

参考:Container | Jellyfin 三个不同镜像源:

  • Official container image: jellyfin/jellyfin Docker Pull Count.
  • LinuxServer.io image: linuxserver/jellyfin Docker Pull Count.
  • hotio image: hotio/jellyfin Docker Pull Count.

查看它们的 Dockerfile,可以看到安装了不同显卡的驱动,包含 va-api,opencl。

nvidia-opencl-icd-340 \
i965-va-driver \
mesa-va-drivers && \

gpu 转码硬件加速

Intel GPU | Jellyfin

dev/dri

默认已经设置好用户权限了

docker-compose 中设置

devices:
      - /dev/dri/:/dev/dri/
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

NVIDIA GPU | Jellyfin

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

sudo nvidia-ctk runtime configure --runtime=docker

sudo systemctl restart docker

linux 迁移到 docker

Migrating | Jellyfin

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

浏览器支持的编码

Codec Support | Jellyfin

不同硬件支持

不同显卡对应支持的硬件编解码 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 测试
ffmpeg -init_hw_device vaapi=va:/dev/dri/renderD128
# 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 核显

Intel GPU | Jellyfin

  • 转码: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"
  • lxc 需要设置 gpu 设备 gid

参考:

字幕乱码

中文字幕显示方框,需要设置备用字体。 在备用字体目录下放置字体 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 的风险,有人提出是否要修复

直接播放 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)