[Docker]使用Jellyfin搭建家庭影音中心

安装
1.启动核显支持
Jellyfin支持调用显卡对视频进行硬件编解码,可以极大地提高播放流畅度,减少系统资源占用,但需要硬件支持,笔者使用的CPU是G4600,核显是HD630,支持H265编码视频的硬件解码。可以在本文附录的链接中查询到不同CPU和GPU对硬件解码的支持情况。
Unraid 默认没有加载核显的驱动,需要手动加载:
2.添加开机启动
3.通过Docker方式安装
创建Jellyfin容器的命令行如下,这是笔者自己搭建Jellyfin时使用的,在关键的几个参数后面都加了注释,稍后我会用表格的方式详细说明每个参数,方便使用 Unraid 的小伙伴通过 Docker 界面创建 Jellyfin 容器。
创建 Jellyfin 容器的参数配置
DOCKER >> ADD CONTAINER 进入容器创建界面,点击右上角 BASIC VIEW 切换到高级视图。
如图所示,设置容器名称(Name)、仓库名称(Repository),然后修改网络类型(Network Type)为 `Host` 。这里推荐使用 `Host` 网络类型,方便后面解决一些Jellyfin的小问题。

然后进行容器参数的配置和路径映射,我以表格方式列出每个参数的设置和说明:

PUID和PGID的查询
上面的表格中 PUID 和 PGID 分别指系统的 用户ID 和 用户组ID。我们在安装 Unraid 时,除了系统管理员用户 `root` 还创建了另一个用户。点击导航栏 USERS 就可以查看到 Unraid 系统中的所有用户了,但在这个界面无法查询到用户的ID号,我们需要点击导航栏最右的终端图标,进入终端界面,输入 `id username` 命令进行查询,如图所示。

关于Path路径
除了配置文件必须使用 Jellyfin Docker 指定的容器路径 `/config`,像电影、剧集、音乐等媒体的容器路径可以自行定义,不用局限于上面表格中的 `/data/movies`,只要不和容器内的原有路径冲突即可。
比如,在主机上有多个存储电影的目录:`/disk1/movie1`, `/disk2/movie2` ,那么在配置 Path 路径映射的时候,可以在容器路径填写 `/data/MyMovie1` `/data/MyMovie2` 分别映射到主机的对应目录,Jellyfin 的媒体库会自动识别这些路径的位置。

配置完成后,点击 APPLY 开始镜像下载和运行,由于使用 Host 网络类型,成功运行 Jellyfin 容器后可以使用默认的 8096 端口进行访问。
Jellyfin的详细使用教程推荐观看B站UP主@司波图的视频:
免费开源影音服务器Jellyfin部署全攻略(BV1ME411o7H2)
超完美整理家庭影音资料库(BV1DE41187FG)
设置
1. 设置硬件加速
进入 Jellyfin 控制台 >> 播放 >> 转码 如下图设置 硬件加速 和 VA API设备,并在下方勾选需要启动硬件解码的格式(HEVC即H265)

解决Jellyfin的小问题
1.演员照片无法正常显示的问题
笔者的电影和剧集都是通过 TinyMediaManager 进行搜刮的,会在目录里生成对应的 nfo 文件。在 Jellyfin 的电影详情界面能正常显示海报和主题,但演员的照片却无法显示,只显示不同颜色的图标。明明在 themoviedb 网站上都有照片的...

最后,经过各种手段的尝试,笔者锁定了问题的根源:Jellyfin 容器内的网络无法正常访问 api.themoviedb.org,也就无法下载演员照片到 Jellyfin 的数据库。
解决问题
首先,通过 DNS Checker (https://dnschecker.org/) 网站找到可以访问 `api.themoviedb.org` 和 `www.themoviedb.org` 的IP地址。
笔者先尝试修改 Jellyfin 容器内的 hosts 文件,可惜容器的系统连 vi 都没有,遂放弃。
既然无法修改容器的 hosts,那就只能修改主机的 hosts 文件,同时把 Docker 容器的网络模式从 `Bridge` 桥接模式变为 `Host` 主机模式,让 Jellyfin 容器使用主机的网络。
进入 Unraid 系统终端界面,运行如下命令,修改 hosts 文件:
保存后,进入 Unraid 管理页面,编辑 Docker 中 Jellyfin 的配置文件,切换网络模式为 `Host`,容器将重新生成。这就是上文直接使用 Host 模式来创建容器的原因。再次打开 Jellyfin 稍作等待,Jellyfin 后台会自动开始下载演员的照片到数据库中,打开电影详情界面,演员的照片都可以正常显示啦!

2.中文/日文字幕无法正常显示变成方块的问题
在播放一些动漫的时候发现某些字幕文字无法正常显示,变成了方块“口口口口”乱码。

这种情况多发生在使用了 ASS 特效字幕的视频播放中,毫无疑问是字体的问题了。经过一番折腾,笔者发现 ASS 特效字幕的字体定义十分繁杂,比如这个,定义了十多行字体标签。(字幕组的同学们真的是很用心在制作呀!)

进入 Jellyfin 控制台,在播放选项中,可以发现 `备用字体文件路径` 这个设置。看来只要把字体上传到服务器并映射到 Jellyfin 容器内就好了。在下载动漫种子的时候,字幕组也正好提供了他们使用的字体文件,但是大小接近100MB的字体文件,已经远远超过 Jellyfin 备用字体的大小限制了。而且不同字幕组使用的字体也不尽相同,难道每次都要手动去找字体文件,然后上传到服务器吗?
又经过一番搜索折腾,笔者找到了这个:CodePlayer/webfont-noto (https://github.com/CodePlayer/webfont-noto) 这是一个 woff2 字体集,包含了中日韩三种语言的字体,重点是体积小巧,简中、繁中、日文、韩文加一起只有7MB。

如此一来问题就迎刃而解啦!先用 FileBrowser 在 Jellyfin 配置文件路径里新建一个 `extraFonts` 文件夹用来存放字体文件,上传四种语言的字体。然后在 Jellyfin 控制台中设置备用字体路径并勾选 `启动备用字体`,最后重启 Jellyfin 容器。

测试播放,字幕完美显示!

附上字体文件链接:
https://pan.baidu.com/s/1BfIhq_K5XguYwHCDd7HJ3A 提取码: bc8t
Reference
核显视频编码硬解支持列表
https://tieba.baidu.com/p/6119362452
Installing Jellyfin | Documentation - Jellyfin Project
https://jellyfin.org/docs/general/administration/installing.html#unraid-docker
关于字幕和封面显示方块的解决方法
https://tieba.baidu.com/p/7255811856
Add options to use multiple custom fonts for subtitle rendering
https://github.com/jellyfin/jellyfin-web/pull/1636