快轉到主要內容

Jellyfin:用Docker自架可調畫質 + 硬體解碼的影片音樂串流伺服器

· 民國114年乙巳年
·
切換繁體/簡體
分類   Linux系統 Self-hosting自架
標籤   Media Server
目錄

想要在家裡透過區網,用電視播放電腦上的影片,除了用SMB分享資料夾以外,還可以考慮更進階的多媒體中心方案,打造一套離線的Netflix。

就用Jellyfin吧,這是一款自由開源的影音串流伺服器軟體,源自專有軟體「Emby」,設定上十分簡單直觀。

有了JellyFin,就能透過手機和電視盒無線播放電腦上的影片,打造多人共享的家庭影院。出門在外也能連回家中播放影片,還能順便聽音樂。

本文Ivon將介紹如何使用Linux系統Docker架設JellyFin伺服器,並說明觀看方法。

1. Jellyfin特色功能
#

  1. 串流播放電腦的影片和音樂,不論是用網頁、手機APP、電視盒都行。支援多重帳號登入,多人畫面同步分享影片。

  2. 能以硬碟資料夾模式瀏覽媒體檔案

  3. Jellyfin會根據影片檔名,自動抓取影劇的封面和演員資訊,產生影片縮圖,允許手動編輯中繼資料。

  4. 播放影片就像看Youtube,自動依照網速調整畫質讓播放更順暢,支援投放到Chromecast、AirPlay。

  5. 還能充當雲端音樂播放器。

  6. 支援多使用者,一個Jellyfin伺服器可以同時開好幾個帳號給其他人用。每個帳號能夠設定可觀看哪些影片。

  7. Jellyfin提供多種插件,例如搭配BT下載管理器Sonarr、影音串流的Kodi、觀看統計JellyStats使用。Jellyfin的觀看歷史紀錄能夠跨裝置同步。

  8. 請注意:Jellyfin不是串流平台,它不是幫你整合各家線上服務,而是掃描硬碟影片並整理出一個漂亮的瀏覽界面,兼具影片播放器的功能。因此影片檔案你要自己準備。

2. 建議的影片資料夾結構
#

Jellyfin會掃描硬碟影片,嘗試從TheMovieDB抓取影片的中繼資料,並顯示一個多媒體中心的面板讓你瀏覽。這樣比起單純以資料夾形式瀏覽影片舒服多了吧。

如果你要使用Jellyfin的中繼資料功能,應該要遵循建議的格式放置檔案,方便爬蟲抓取正確的資料,否則Jellyfin可能會無法辨識集數。

根據Jellyfin的官方文件,一個「電影」資料夾的結構應該如下:

電影
├── 電影名稱 (年份)
│   ├── 電影名稱 (年份).mp4
│   ├── 電影名稱 (年份).nfo
│   ├── 電影名稱 (年份).en_us.srt
│   ├── cover.png
│   └── theme.mp3
└── 電影名稱二 (年份) [imdbid-tt12801262]
    ├── backdrop.jpg
    └── VIDEO_TS
        ├── VIDEO_TS.BUP
        ├── VIDEO_TS.IFO
        ├── VIDEO_TS.VOB
        ├── VTS_01_0.BUP
        ├── VTS_01_0.IFO
        ├── VTS_01_0.VOB
        ├── VTS_01_1.VOB
        └── VTS_01_2.VOB

每部電影都應該以一個資料夾分類,裡面是影片檔和電影,命名格式是[電影名稱] [年份],後面可以再加上一串IMDB資料庫的ID。影片檔名後面加上季數與集數。Jellyfin大部分影片格式都支援,從DVD抽取出來的VBO檔案也可以播放。如果有.srt字幕檔,則應該跟影片放在同一個資料夾下。

如果是電視節目,分類方法類似。以下是多部「動畫」資料夾的結構:

動畫
├── 動畫名稱 (年份)
│   ├── 第一季
│   │   ├── 特別篇.mkv
│   │   ├── 動畫名稱 S01E01.mkv
│   │   └── 動畫名稱 S01E02.mkv
│   ├── 第二季
│   │   ├── 動畫名稱 S02E01-E02.mkv
│   │   ├── 動畫名稱 S02E03.mkv
│   │   └── 動畫名稱 S02E04.mkv
│   └── 第三季
│       ├── 動畫名稱 S03E01.mkv
│       ├── 動畫名稱 S03E02.mkv
│       ├── 動畫名稱 S03E03 Part 1.mkv
│       └── 動畫名稱 S03E03 Part 2.mkv
└── 動畫名稱 (年份)
    ├── 第一季
    |   ├── 動畫名稱 S01E01.mkv
    |   └── 動畫名稱 S01E02.mkv
    └── 第二季
        ├── 動畫名稱 S01E01-E02.mkv
        └── 動畫名稱 S01E03.mkv

每部動畫都要用一個資料夾分類,並用資料夾區隔各季集數。如果有.srt字幕檔,則應該跟影片放在同一個資料夾下。

關於檔案名稱要用中文還是英文:看情況。TheMovieDB包含多國語言翻譯的標題,大部分時候都抓得到,不過也有誤判的時候。

3. 用Docker架設Jellyfin
#

根據Jellyfin官方文件,推薦硬體規格為:Intel N100以上等級CPU、4GB以上RAM、100GB以上SSD。系統架構以x86為佳,Jellyfin對ARM架構的支援程度不一。

如果需要在播放的時候轉碼,CPU不能太差,若有GPU加速更好。

  1. 在Linux伺服器安裝Docker

  2. 欲啟用GPU硬體加速解碼,需要安裝顯示卡驅動與調整設定,這個後面再講,這邊先以CPU解碼為主。

  3. 參考Jellyfin官方文件,建立docker-compose.yml

mkdir ~/jellyfin

cd jellyfin

vim docker-compose.yml
  1. 填入以下內容,注意我寫的註解部份
services:
  jellyfin:
    image: jellyfin/jellyfin
    container_name: jellyfin
    user: root:root # 以root使用者執行服務
    network_mode: 'host' # 如果你需要從區域網路存取,可以把host改成bridge模式
    volumes:
      - "./config:/config" # 將設定檔和縮圖的存放至目前的資料夾
      - "./cache:/cache"
      - type: bind  #參考下面格式,將硬碟的資料夾(source)依序掛載至Jellyfin容器內部的資料夾(target),權限設定唯讀,以此類推。
        source: "/home/user/電影/"
        target: "/電影/"
        read_only: true
      - type: bind
        source: "/home/user/動畫/"
        target: "/動畫/"
        read_only: true
      - type: bind
        source: "/home/user/音樂/"
        target: "/音樂/"
        read_only: true
    restart: 'unless-stopped' # 開機自動啟動容器
    environment:
      - JELLYFIN_PublishedServerUrl=http://example.com # 除非您有自己的域名,否則不需改這行
    extra_hosts:
      - "host.docker.internal:host-gateway"
  1. 啟動容器。此容器會在每次開機後自動啟動。
docker compose up -d
  1. 用瀏覽器開啟網址http://localhost:8096或者http://Linux電腦區域IP:8096,按照設定精靈的提示繼續。

  2. 設定帳號密碼,預設使用root

  3. 點選新增媒體庫,從/media資料夾選擇掛載的影片資料夾

  4. 設定要自動抓取的中繼資料,中繼資料就是影片的說明、演員、發行年份的資訊,Jellyfin會依照影片資料夾與檔名去比對,之後能手動編輯。

Ivon建議:如果您的影片資料夾不含電影、影集、動畫的影片,建議將媒體庫內容類別改為「Mixed Movies and Shows」或者「音樂錄影帶」,將影片以「純資料夾」模式處理。取消勾選所有「下載中繼資料」和「圖片獲取程序」選項,僅保留「Embedded Image Extractor」和「Screen Grabber」產生縮圖。不然Jellyfin會把每個子資料夾錄當成「一季」影集處理,且會下載到奇怪的封面,影片檔名可能還會顯示錯誤。

如果你的影片命名不是那麼標準的話,Jellyfin可能會抓錯中繼資料,這個時候也建議關閉下載中繼資料的選項。

  1. 設定中繼資料語言為正體中文。

  2. 完成設定之後,登入帳號。點選右上角管理員設定 → 控制台 → 媒體庫,掃描所有媒體庫。

  3. 隨後影片就會出現在首頁。

  4. 你也可以用跟Linux伺服器位於同一Wifi網路下的電腦或者手機,輸入http://Linux電腦區域IP:8096網址,開啟這個網頁界面,播放影片。

4. Jellyfin影片解碼問題:Direct Play與轉碼
#

雖說Jellyfin用網頁瀏覽器就可以看,不過實際上不建議這樣做。

Jellyfin在播放影片的時候,點右下角切換「品質」,選擇「Driect Play」會直接串流原始檔案,就好像在用影片播放器直接開啟SMB分享的檔案一樣。若是選擇其他畫質,Jellyfin的伺服器端會在串流影片的時候進行即時轉碼,讓串流比較順暢。對硬體較弱的電視盒客戶端來說,此作法也有助於提昇相容性。

Jellyfin並不會在後台把影片轉檔再串流,一律都是在串流的時候才即時轉碼的。

如果是用網頁瀏覽器播放Jellyfin影片的話,影片串流的時候容易遇到解碼問題,若伺服器端硬體不好便會影響使用體驗,這要看原始影片的編碼器,還有Jellyfin客戶端的解碼支援度。

譬如原始影片是H.264編碼,則大多數瀏覽器都支援解碼,也就能使用Direct Play。不過如果是AV1編碼可能就會遇到瀏覽器不支援的問題,像iOS Safari就會黑螢幕。此時Jellyfin伺服器端會嘗試即時轉碼成H.264,防止影片無法播放。

Direct Play播放的一律是原始畫質的影片,對頻寬要求較高,因此適合區域網路使用。如果因為網速問題需要切換到其他品質,則Jellyfin一律會進行轉碼。

如何確定Jellyfin是Direct Play還是有在轉碼?嘗試播放一部影片,看品質選項有無顯示「Direct」就知道瀏覽器支援不支援該部影片編碼了。

在播放影片的時候開新分頁,點Jellyfin右上角管理員設定 → 控制台 → 使用中的裝置,點一下i,可以知道正在播放的影片是否為Direct Play,或者正在轉碼。

「直接播放」就是Direct Play。

「重新封裝中」就是在轉碼。且串流的時候轉碼,Jellyfin伺服器的CPU負載會顯著上升。

上面說到,Jellyfin的伺服器硬體不好會大大影響串流體驗,可能你只是想播放一部4K影片,但卻被轉碼拖累;或者明明客戶端硬體支援更多影片解碼,卻因為瀏覽器的關係被限制住。

這個時候要嘛啟用GPU硬體加速轉碼,要嘛就不要用瀏覽器播放了,改裝內含解碼器的Jellyfin客戶端。

5. 安裝Jellyfin客戶端
#

Jellyfin網頁版效能不好,建議安裝原生客戶端,它們能有效利用客戶端硬體的解碼能力,避免Jellyfin在串流的過程中還得轉碼影片。

雖然Jellyfin官方有推出全平台的客戶端應用程式,不過手機版只是瀏覽器套殼而已,效能不佳,需要視情況採用第三方開發的客戶端。

這些客戶端連線方法大同小異,只要讓連線的客戶端與Jellyfin伺服器處在同一個Wifi區域網路,輸入Jellyfin伺服器的IP,還有帳號密碼就能存取。

名稱支援系統功能
Jellyfin Media PlayerLinux, Windows, macOSJellyfin官方開發的影片播放器,使用MPV函式庫,提供原生解碼器。另有手機版Jellyfin Mobile,沒有原生解碼器,僅是瀏覽器套殼。
FindroidAndroid專為Android設計的影片播放器,使用MPV函式庫,提供原生解碼器。
FinampAndroid, iOS音樂播放器。
SwiftfiniOS專為iOS設計的影片播放器,提供原生解碼器。
FeishinLinux, Windows, macOS音樂播放器。
Jellyfin MPV ShimLinux, Windows, macOSJellyfin官方開發的投放應用程式,類似Chromecast。可以從Jellyfin網頁版右上角投放影片到裝有Jellyfin MPV Shim的裝置。

6. Jellyfin使用技巧
#

從外部網路存取Jellyfin媒體庫
#

Jellyfin預設可以用區域網路播放,那要怎麼從不同網段存取家中的電腦呢?

  1. 安裝內網穿透軟體,將電腦和手機加入虛擬區域網路

  2. Linux伺服器的防火牆開啟8096 TCP通訊埠。

sudo ufw allow 8096/tcp

sudo ufw reload
  1. 這樣的話,要存取Jellyfin,只要在伺服器IP欄位輸入http://虛擬區域IP:8096即可。手機客戶端也是一樣原理。

啟用資料夾檢視
#

在「控制台」的媒體庫頁面,開啟在首頁左側選單顯示「資料夾」模式的功能。這樣就能按照電腦硬碟資料夾架構去找檔案。

切換佈景主題
#

進入Jellyfin首頁,點選左邊選單開啟「設定」 → 「顯示」,變更佈景主題,滑掉最下面按下儲存。

您也可以自行下載CSS調整Jellyfin的外觀。

解決.ass中文字幕變成方框
#

如果影片的.ass字幕檔有使用額外字型,需要手動放入字型,否則中文字幕會變成方塊。

  1. 將要使用的.ttf或者.otf字型集中放在一個Linux的資料夾,例如參照FreeDesktop的XDG標準,放到/home/user/.local/share/fonts/資料夾。

  2. 修改Jellyfin的docker-compose.yml,修改Docker volume的部份,將字型所在的資料夾掛載進容器裡面的/usr/local/share/fonts/custom/

    volumes:
      - "./config:/config"
      - "./cache:/cache"
      - type: bind
        source: "/home/user/電影/"
        target: "/電影/"
        read_only: true
      - type: bind
        source: "/home/user/動畫/"
        target: "/動畫/"
        read_only: true
      - type: bind
        source: "/home/user/音樂/"
        target: "/音樂/"
        read_only: true
      - type: bind # 掛載字型目錄
        source: "/home/user/.local/share/fonts/"
        target: "/usr/local/share/fonts/custom/"
        read_only: true
  1. 重新啟動Jellyfin的Docker服務。
sudo docker compose down

sudo docker compose up -d
  1. 開啟Jellyfin,點右上角 → 控制台 → 播放 → 轉檔,勾選啟用備用字體,在這裡填入字型所在目錄。捲動到畫面最下面儲存。

新增其他Jellyfin使用者
#

進入Jellyfin首頁,點選右上角 → 控制台,在「使用者」頁面新增使用者。

在這裡能自由決定要開放哪些媒體庫給該位使用者觀看。

之後會有更詳細的權限控管,例如只能看特定媒體庫,禁止調整伺服器設定,啟用家長監護功能等。如果電腦撐不住同時太多人觀看,請調低「網際網路串流傳輸位元率限制」。

多人同步觀看同部影片
#

Jellyfin提供「SyncPlay」技術,讓不同使用者能同步觀看同一支影片。

  1. 第一個使用者在Jellyfin右上角點選「建立群組」

  2. 第二個使用者便可加入群組。

當第一個使用者播放影片的時候,第二個使用者的畫面也會跟著播放影片。點選右上角離開群組,退出同步播放。

啟用GPU硬體加速轉碼
#

Jellyfin預設使用CPU轉碼影片,若啟用GPU硬體加速 (Hardware Acceleration) 轉碼可讓影片處理速度更快。

Jellyfin支援Intel/AMD/Nvidia的加速技術,官方文件有詳細說明。

為方便處理影片,Jellyfin官方開發了特製版的jellyfin-ffmpeg套件,此一套件已含在Jellyfin的官方Docker映像檔,無需另外安裝。

Nvidia GPU啟用NVENC硬體解碼 (點選展開)
  1. 首先要先安裝Nvidia驅動和Nvidia Container Toolkit

  2. 將使用者加入video群組

sudo usermod -aG video root
sudo usermod -aG video $USER
  1. 編輯docker-compose.yml,在最下面加入runtime
    runtime: nvidia
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
  1. 更新Jellyfin容器的動態連結,重啟Docker服務
sudo docker exec -it jellyfin ldconfig

sudo systemctl restart docker
  1. 檢查容器是否能存取Nvidia顯示卡,應能印出顯示卡驅動資訊
sudo docker exec -it jellyfin nvidia-smi
  1. 進入Jellyfin首頁,點選左邊選單→ 「設定」→「控制台」 →「播放」,選擇使用Nvidia NVENC硬體加速,再往下捲動按儲存。

Intel CPU啟用QSV或VA-API硬體解碼 (點選展開)

只要Intel CPU有內顯,幾乎所有Intel GPU都支援VA-API硬體解碼。QSV則是要Haswell架構以後才支援。

儘管開發者說Intel解碼驅動和OpenCL執行時已含在Jellyfin的映像檔,不需要額外安裝驅動,但若驅動找不到,請還是參考官方文件了解要安裝哪些驅動套件。可能還得設定LIBVA_DRIVER_NAME的環境變數。

  1. 安裝OpenCL執行時套件
sudo apt install intel-opencl-icd
  1. 將使用者加入render群組
sudo usermod -aG render root

sudo usermod -aG render $USER
  1. 取得render群組的ID,每台電腦數字不一樣
sudo getent group render | cut -d: -f3
  1. 修改docker-compose,在最下面加入devices
    devices:
      - /dev/dri/renderD128:/dev/dri/renderD128
  1. 重新啟動容器
sudo docker compose down

sudo docker compose up -d
  1. 檢查Jellyfin容器能否印出Intel解碼器版本
sudo docker exec -it jellyfin /usr/lib/jellyfin-ffmpeg/vainfo
  1. 檢查Jellyfin容器能否印出OpenCL執行時
sudo docker exec -it jellyfin /usr/lib/jellyfin-ffmpeg/ffmpeg -v verbose -init_hw_device vaapi=va -init_hw_device opencl@va
  1. 重新啟動容器
sudo docker compose down

sudo docker compose up -d
  1. 至Jellyfin首頁,點選左邊選單 → 「設定」→「控制台 →「播放」,選擇使用Intel QSV硬體加速,往下捲動按儲存。

要確認影片解碼有無運作,隨便開一部影片,然後用nvtop這類工具查看GPU使用率就知道了。

相關文章

LANraragi,網頁整理同人本漫畫,支援自動上E-hentai標籤,Docker版部署教學
分類   Linux系統 Self-hosting自架
標籤   Media Server E-Hentai Mihon Doujinshi Docker
Gonic:自架音樂串流伺服器,支援資料夾模式播放音樂
分類   Linux系統 Self-hosting自架
標籤   Media Server Last.fm
標籤式圖片管理軟體,Hydrus Network的Docker遠端存取方案
分類   Linux系統 Self-hosting自架
標籤   Hydrus Network Docker Media Server Photo Gallery

此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。

(留言板載入中)這是Disqus留言板,您可能會看到Disqus強制投放的廣告。為防止垃圾內容,有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。若要上傳圖片請善用圖床網站。