本地媒体库的创建可以分为几步走:
步骤 2 和 3 循环往复,可以打造出庞大的个人影视库,视频资源文件占用空间较大,所以我单独又加了几个 T 的存储空间,影片文件不担心损坏和丢失,一般的数据盘足够,目前为止使用良好。
另外,使用 Jellyseerr + Sonarr + Radarr + Jeckett + Transmission 这样一套软件组合,可以实现影片资源追踪、下载和自动归档分类。
以上是一组经典且理想化的搭配方案,实际使用后的感受是这套软件对中文影视剧的支持还是偏弱一些,所以我个人现在比较常用的方式简化为三部分:
以上还是有一定操作量的,仅适用于我,因为我的影视剧需求并不多,可以管理细致一些,有关软件安装和目录结构的注意事项后面会专门讲。
Jellyfin 官方提供的播放器(包括 PC 和客户端)是一个浏览器驱动的 web player,本质上是直接使用了 HTML 的 <video> 标签
标签对媒体文件的支持度直接限制了 Jellyfin 播放器对媒体文件类型的支持范围,比如对 .mkv 这类不在支持列表的媒体编码或格式文件会提示播放错误
这就需要对媒体文件进行编码或文件类型转换,转码成支持的文件,以下是 <video> 标签支持的媒体信息列表,从中可以看出对 MP4 容器支持较好:
编解码器简称 | 编解码器全称 | 容器支持(文件类型) |
---|---|---|
AV1 | AOMedia Video 1 | MP4、WebM |
AVC (H.264) | Advanced Video Coding(高级视频编码器) | 3GP、MP4 |
H.263 | H.263 Video | 3GP |
HEVC (H.265) | High Efficiency Video Coding(高效视频编码) | MP4 |
MP4V-ES | MPEG-4 Video Elemental Stream(MPEG-4 视频元素流) | 3GP、MP4 |
MPEG-1 | MPEG-1 Part 2 Visual | MPEG、QuickTime |
MPEG-2 | MPEG-2 Part 2 Visual | MP4、MPEG、QuickTime |
Theora | Theora | Ogg |
VP8 | Video Processor 8 | 3GP、Ogg、WebM |
VP9 | Video Processor 9 | MP4、Ogg、WebM |
Html Video Player 无论从播放功能还是媒体格式支持度上都无法与专业的播放器相比较,因此在媒体播放器的选择上,我最终的方案是 Vidhub + Kodi。
先说结论,对于个人或家庭成员使用,我觉得完全用不上服务器编解码和硬件加速。
前面提到了,媒体的播放与媒体编码、文件格式和播放器选择息息相关,在我的媒体播放方案中,是把 Jellyfin 作为媒体存储和推流服务器使用(串流),服务器不负责转码工作,而是将媒体的解码和播放交给 Vidhub 等播放器,依靠播放器强大的能力完成工作,是一种服务端做轻而客户端做重的选择:
我们来看下高清视频文件需要的网络带宽,视频文件有如下公式:
视频文件大小(字节)≈ 码率(比特/秒)× 视频时长(秒)/ 8
一部视频容量为 35G 的两个小时 BD50 蓝光电影,其码率也只有 41Mbps(40777kbps),再经过 HEVC 等编码,可以在同等质量下得到更低的码率和文件大小,参考前面的 Interstellar 影片,其码率为 12.5Mbps(12796kbps,爱奇艺 720p 高清码率为 4Mbps)。以现阶段的家庭宽带普及率,按平均百兆带宽来估算,去掉网络损耗,客户端下行速度最高可以达到 90Mbps,影片服务器上行速度至少有 20Mbps,支持这样一部4K 影片的上传和下载完全没有问题。
更何况我的媒体资源选择绝大多数 1080p 就已经足够,而且宽带配置至少是千兆网。
那么,什么情况需要实时转码?如果搭建的影视平台面向更大更多样的用户群体,则需要通过媒体服务器对视频文件进行源数据处理,以适应更广泛的用户需求,因为:
所有大型影视媒体平台均支持媒体的服务端转码,或者说必须要支持,其中还有一条非常重要的原因是:能够控制媒体的质量就可以控制用户,比如针对普通用户限流,高级用户可以享受更高清的观看体验。
试想,资本家怎么可能那么无私,花费巨大的管理成本和技术成本为普通用户提供高质量的影视剧,商业媒体平台至少都希望达到以下两点:
第 2 条制约着第 1 条,就是说用户花钱买会员,也不一定能够得到与之匹配的更高质量的视频流,花钱买到的是假高清,这是经网友实验证实过的。
不过言归正传,Jellyfin 也支持服务端对视频文件编解码,包括开启服务器硬件加速,开启转码后就可以在客户端选择不同的视频质量进行传输与播放。
我尝试过实时转码和硬件加速配置,这和服务器所使用的处理器相关,由于群晖 220+ 服务器的 CPU 性能一般,虽然官网显示支持 Quick Sync Video,但实测开启硬件加速会让 NAS 服务器卡到无法运行,最终放弃。可见服务端实时转码非常消耗硬件资源,商用媒体平台必须做相应的硬件配置规划,而个人服务器受硬件限制较多,这部分会在我尝试成功后再分享出来。
还是那句话,就家庭使用场景,直出才是最低成本高质量的选择。
Jellyfin 和配套软件安装在 NAS 服务器,分为两个 Docker 项目进行管理,直接贴上 Docker Compose:
---
version: '3'
services:
jellyfin:
image: jellyfin/jellyfin:latest
container_name: jellyfin-core
restart: unless-stopped
network_mode: "host"
environment:
- PGID=1000
- PUID=1000
- LOG_LEVEL=debug
- TZ=Asia/Shanghai
ports:
- 8096:8096
volumes:
- /xxx/MediaCenter/apps/jellyfin/config:/config
- /xxx/MediaCenter/apps/jellyfin/cache:/cache
- /xxx/MediaCenter/data/media:/media
---
version: '3'
services:
jellyseerr:
image: fallenbagel/jellyseerr:latest
container_name: media-jellyseerr
environment:
- LOG_LEVEL=debug
- TZ=Asia/Shanghai
ports:
- 5055:5055
volumes:
- /xxx/MediaCenter/apps/jellyseerr/config:/app/config
restart: unless-stopped
transmission:
image: linuxserver/transmission:latest
container_name: media-transmission
networks:
macvlan_66:
ipv4_address: 192.168.51.2
restart: unless-stopped
ports:
- 9091:9091
- 51413:51413
- 51413:51413/udp
environment:
- PGID=1000
- PUID=1000
- TZ=Asia/Shanghai
- USER=admin
- PASS=xxxxxx
volumes:
- /xxx/MediaCenter/apps/transmission/config:/config
- /xxx/MediaCenter/apps/transmission/watch:/watch
- /xxx/MediaCenter/data/downloads:/data/downloads
jackett:
image: linuxserver/jackett:latest
container_name: media-jackett
restart: unless-stopped
ports:
- 9117:9117
environment:
- PGID=1000
- PUID=1000
- TZ=Asia/Shanghai
volumes:
- /xxx/MediaCenter/apps/jackett:/config
radarr:
image: linuxserver/radarr:latest
container_name: media-radarr
restart: unless-stopped
ports:
- 7878:7878
environment:
- PGID=1000
- PUID=1000
- TZ=Asia/Shanghai
volumes:
- /xxx/MediaCenter/apps/radarr:/config
- /xxx/MediaCenter/data:/data
sonarr:
image: linuxserver/sonarr:latest
container_name: media-sonarr
restart: unless-stopped
ports:
- 8989:8989
environment:
- PGID=1000
- PUID=1000
- TZ=Asia/Shanghai
volumes:
- /xxx/MediaCenter/apps/sonarr:/config
- /xxx/MediaCenter/data:/data
networks:
macvlan_66:
external: true
在安装配置方面最需要注意的是媒体目录的设计与挂载,sonarr 和 radarr 需要在 transmission 和 jellyfin 媒体目录中进行文件监控与操作,因此目录全量挂载便于软件配置并开展文件处理工作,推荐结构如下:
└── MediaCenter
├── apps
│ ├──jellyfin
│ ├──jellyseerr
│ ├──sonarr
│ ├──radarr
│ ├──jackett
│ └──transmission
└── data
├──media
│ ├──movies
│ └──tv
└──downloads
├──complete
└──incomplete
Radarr 容器挂载了 MediaCenter/data 目录,源文件(downloads/complete/)和目标文件(media/movies/)在容器内属于同一磁盘卷,这样就能够开启硬链接代替文件复制,可以减少磁盘空间占用
Radarr 媒体根目录与 Jellyfin 影片目录是同一个,这样就保证了 Radarr 在创建影片目录、下载完影片资源、按规则重命名、建立硬链接后自动完成媒体库的新增,Jellyfin 只需要定时完成元数据刮削即可,Sonarr 同理
另外,我使用 Macvlan 为 Transmission 设置独立 IP,主要的作用是方便为其配置代理直连规则,由于 NAS 在机场后面,我可不想流量全部用在影片的下载上面。
其他参考:https://zerodya.net/self-host-jellyfin-media-streaming-stack/