︿
Top

Jellyfin (一) 打造居家完美影音平台


拜科技進步之所賜,現在已經可以輕而易舉的從網路上觀賞電影或連續劇,雖然有像 Netflix、Disney+、Gimy 等影音平台存在,但或多或少我們會有一些想要本地珍藏的高清影劇,它們不受平台的綁架、甚至是下架看不到的風險,為此,Jellyfin 應孕而生,它是目前最熱門的 Open Source 影音專案、為你的 D槽提供了功能強大且易用的影音平台管理播放介面。

以 Synology 為例,在 DSM 7.2.2 版本宣布將停止支援 Video Station 應用後,官方也是推薦 Jellyfin 作為視聽影音的替代解決方案,使用 Jellyfin 的好處在於它可以輕鬆地將你磁碟中的影音檔案自動化的帶入封面、電影戲劇簡介、演員名單、標籤等資料,以海報牆的方式展示用戶的海量視聽資料,其客戶端更是橫跨了 Web瀏覽器、Android、Android TV、iOS、Windows 與 Linux APP 等不同裝置以便你隨時隨地觀影,以下我們將透過 docker-compose 的安裝方式來建置你的個人專屬 Jellyfin 影音平台。




環境說明

主機規格:Intel(R) Xeon(R) CPU E3-1230 v3(Haswell 第四代架構
作業系統:RockyLinux 8.8
影音檔案存放於目錄:/mnt/Movies
映像檔案使用:jellyfin/jellyfin:10.10
佔用端口:8096




安裝步驟

1. 如果你的 Linux 主機上並沒有安裝 docker 和 docker-compose,才需執行這個步驟

[root@host ~]# dnf install -y nano wget git
[root@host ~]# wget https://download.docker.com/linux/centos/docker-ce.repo
[root@host ~]# mv docker-ce.repo /etc/yum.repos.d/
[root@host ~]# dnf install -y docker-ce-20.10.24
[root@host ~]# systemctl enable docker && systemctl start docker

[root@host ~]# curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
[root@host ~]# chmod +x /usr/local/bin/docker-compose
[root@host ~]# docker-compose --version
docker-compose version 1.29.2, build 5bezea4c

2. 建立擺放 Jellyfin 容器相關資料的資料夾,本例預設為 /root/docker_home

[root@host ~]# mkdir -p ~/docker_home/jellyfin && cd ~/docker_home/jellyfin
[root@host jellyfin]# nano docker-compose.yml
< docker-compose.yml >
version: '3'
services:
  jellyfin:
    # 拉取最新版Jellyfin映像檔,當下最新版本是10.10
    image: jellyfin/jellyfin:10.10
    container_name: jellyfin
    # 以root使用者執行服務
    user: root:root
    network_mode: 'host'
    volumes:
    # 設定檔和縮圖的存放目錄
      - "./config:/config"
      - "./cache:/cache"
    # 參考下面格式,將存放影音檔案的磁碟目錄(冒號左邊)依序掛載給Jellyfin容器內部的目錄,以此類推
      - "/mnt/Movies:/Movies:ro"
      - "/mnt/Drama:/Drama:ro"
    # 開機自動啟動容器
    restart: 'unless-stopped'
    environment:
    # 除非你有自己的域名,否則不需這行
      - JELLYFIN_PublishedServerUrl=http://movies.example.com
    extra_hosts:
      - "host.docker.internal:host-gateway"

3. 啟動 docker-compose 相關容器,大約 20 秒內會啟動完畢

[root@host jellyfin]# docker-compose up -d
[root@host jellyfin]# docker-compose ps
Name          Command            State       Ports
----------------------------------------------------
jellyfin   /jellyfin/jellyfin   Up (healthy)

4. 這裡我們預設你的前端主機已經安裝好 nginx(網站設定檔部分如下)、配置好相關 ssl憑證、並已於 DNS設定好了 a record 的指向,如果沒有要配置域名的話,家裡內網直接連接 ip 即可

location / {
        proxy_pass http://192.168.88.88:8096;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Protocol $scheme;
        proxy_set_header X-Forwarded-Host $http_host;
        # Disable buffering when the nginx proxy gets very resource heavy upon streaming
        proxy_buffering off;
    }




Jellyfin 平台設定

1. 瀏覽器開啟並登入 Jellyfin網址 https://movies.example.com 或你的內網 ip:8096






2. 為 Jellyfin 添加媒體來源(電影)






3. 回到 Jellyfin 首頁,可以看到我們的海報牆已經被自動建置出來了(如果媒體庫主標題沒有顯示海報,可以再對媒體庫點擊一次「更新媒體資訊」即可)


4. 點入任一電影海報可看到詳細資訊,包含了劇情簡介、影音格式、預告剪影、演員陣容和其他推薦的相關電影



5. 為 Jellyfin 添加媒體來源(連續劇),設定部分與電影類似,元數據擷取器都選取 TheMovieDb 即可








細節調整

Jellyfin 分為影音服務端和播放客戶瀏覽端兩邊的面向,剛剛我們已經在服務端配置好了媒體來源,現在還需要到客戶端裡配置一些屬於個別用戶的設定。

左方側邊選單 > 使用者 > 設定 > 播放

優先使用客戶端播放器來解碼,避免經常性讓伺服端解編碼、過度消耗伺服器資源


向前跳轉長度對齊向後跳轉長度,推薦都設定為 10 秒


左方側邊選單 > 使用者 > 設定 > 用戶端設定(手機端才有的設定)

影片播放器類型推薦從網頁播放器更改為「內建的播放器」,這個客戶端內建播放器是基於 Google ExoPlayer 開發、能夠支援更多的來源影片格式,或是更改為「外部播放器」,並同步更改下方的「外部播放器 APP」為 MX Player,推薦 MX Player APP 開啟預設「硬件解碼器+」以相容更多來源影片格式





檔案命名規則

Jellyfin 之所以強大一方面在於影片刮削的能力,而媒體庫裡的片源該如何正確地被辨識就成了重要的事情,以下有一些目錄或檔案的命名原則是需要注意的。

通常只要目錄或檔案名稱有包含「片名」與「上映年份」就可以正確地被辨識

/電影/
└── 下女的誘惑(2016)
    ├── 下女的誘惑.加長版720p.mp4
    └── 下女的誘惑.加長版720p.CHI.srt

由於兩岸三地給電影取的名字都不太一樣,如果不是很確定片名的話,可以去 TMDB 網站查詢,好的!看來不是女僕的誘惑


如果一個片源是由數個影片檔組成的話,可以在主檔名加上 -CD1 之類的後綴

/電影/
└── 下女的誘惑(2016)
    ├── 下女的誘惑-CD1.mp4
    └── 下女的誘惑-CD2.mp4

數個版本的情況下,可以用以下命名方式,Jellyfin 就不會整理成兩張一模一樣的海報,而是會在一張電影海報裡提供下拉式選單讓用戶選擇所要觀影的版本

/電影/
├── 不能說的秘密 (2007)
│   ├── 不能說的秘密 (2007) - 1080P.mp4
│   └── 不能說的秘密 (2007) - 720P.mp4
└── 周處除三害 (2023)
    ├── 周處除三害 (2023) - [2160p].mp4
    └── 周處除三害 (2023) - [720p].mp4

為了滿足各種使用情境,Jellyfin 還提供了功能型目錄的規範,比如有些電影還有附加彩蛋等的影像片段,為了讓其被整合在同一張電影海報裡,就可以使用以下這種方式處理

/電影/
└── 不能說的秘密 (2007)
    ├── 不能說的秘密 (2007) - 1080P.mp4
    └── extras
        └── 未刪剪片段.mp4

連續劇集或綜藝的部分會比電影多了一個需求,那就是季數與集數,「S04E01」分別取的是 Season 和 Episode

/連續劇/
└── 黑鏡
    ├── 黑鏡.S04E01.2017.mp4
    ├── 黑鏡.S04E02.2017.mp4
    ├── 黑鏡.S04E03.2017.mp4
    ├── 黑鏡.S04E04.2017.mp4
    ├── 黑鏡.S04E05.2017.mp4
    └── 黑鏡.S04E06.2017.mp4




Jellyfin 客戶端播放與伺服器端的軟硬體解編碼與否

以下我們使用 Android 提供的 Jellyfin APP、透過內建的 Exo player 播放電影,可以看到目前的播放方式為「DirectPlay」,也就是說來源影片格式並不需要特別編碼、伺服端直接將影片分割為無數細小的碎檔串流給 Android 媒體播放器讀取播放即可


搞不好這個時候我正在外地出差,手機的網路訊號品質不佳,那我可能會希望降低影片的解析度來換取較低的流量消耗以避免播放卡頓,此時我們將影片格式更改為「360p-420kbps


由於影片原始檔為 1080p 解析度,一旦要更改為 360p 伺服端就必須要先將原始檔案解碼後重新編碼為 360p的解析度,然後才能串流更少量的封包傳送給客戶端,這個轉碼的過程(Transcode)會需要影音伺服器端的「GPU 硬件加速」或是「CPU 軟件加速」


另一個需要消耗伺服器運算資源去解編碼的場景則是當客戶端的媒體播放器不認識影片原始檔的編碼格式時,比如舊款媒體播放器並不認識 Jellyfin 串流傳送過來的 AV1 格式影片時,伺服器端會先將原始影片在本地端重新解編碼為客戶端所認識的格式(比如 AVC / H.254),然後才串流給用戶,以便客戶端媒體播放器直接解碼播放。

通常來說 GPU 硬件加速的效率一定是遠高於 CPU 軟件加速的,為了不造成伺服器的負擔、甚至在有些情況下因為特定解編碼過慢而導致用戶播放卡頓,所以有條件的話都會在 Jellyfin 控制台去設定「硬件加速」


本篇教學因主機CPU支援性問題並沒有啟用硬件加速功能

這也是為什麼我們會看到一些市售中高端的 NAS 經常採用 Intel CPU 來配置並標榜提供硬件加速、實時轉碼的功能,目前在 GPU 影片硬件加速的領域裡,Intel 的 Quick Sync Video(QSV)仍是個人影音串流相容性最好的選擇,比如說我手上的 Synology DS918+ 採用的就是 Intel Celeron J3455 處理器,對照解編碼表便可查出如上圖的支援性。

本篇介紹僅止於 docker 的快速安裝建置,並沒有配置顯卡直通 docker 或是安裝顯卡驅動程式給 docker,有關 Jellyfin 的硬件加速其實還有一些眉角需要注意,這些我們會在之後的篇章給大家補完。





本文內容參閱以下連結:

推薦閱讀:

tomy

來自台灣的系統工程師,一直熱衷於 Open source 相關技術的學習、建置、應用與分享。

  • Image
  • Image
  • Image
  • Image
  • Image

0 Comments:

張貼留言