快轉到主要內容

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

Linux系統 Self-hosting自架 Media Server
🗓️ 民國112年 癸卯年
✍ 切換正體/簡體字
目錄

想要打造多人共享的家庭影院,就使用Jellyfin來播放影片和音樂吧。

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

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

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

1. Jellyfin特色功能
#

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

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

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

  4. 播放影片就像看Youtube,可以調整畫質讓播放更順暢,支援投放到Chromecast。

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

另提供多種插件,可搭配BT下載管理器 Sonarr、影音串流的 Kodi、觀看統計 JellyStats使用。

2. 用Docker架設Jellyfin
#

我的系統規格:

  • 系統:Ubuntu 22.04
  • CPU:Intel i5-7400
  • GPU:Nvidia GTX1050Ti

  1. 在Linux電腦安裝 Docker和Docker-compose

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

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

mkdir ~/jellyfin
cd jellyfin
vim docker-compose.yml
  1. 填入以下內容,注意我寫的註解部份
version: '3'
services:
  jellyfin:
    # 拉取最新版Jellyfin映像檔,撰文當下版本是10.8.10
    image: jellyfin/jellyfin
    container_name: jellyfin
    user: root:root
    network_mode: 'host'
    volumes:
    # 將設定檔和縮圖的存放至目前的目錄
      - "./config:/config"
      - "./cache:/cache"
    # 參考下面格式,將硬碟的目錄(冒號左邊)依序掛載至Jellyfin的/media、/media2、/media3目錄,以此類推
      - "/home/user/Movies:/Movies:ro"
      - "/home/user/Music:/Music:ro"
      - "/home/user/Comics:/Comics:ro"
    # 開機自動啟動容器
    restart: 'unless-stopped'
    environment:
    # 除非您有自己的域名,否則不需改這行
      - JELLYFIN_PublishedServerUrl=http://example.com
    extra_hosts:
      - "host.docker.internal:host-gateway"
  1. 啟動容器。此容器會在每次開機後自動啟動。
sudo docker compose up -d
  1. 用瀏覽器開啟網址http://localhost:8096,按照設定精靈的提示繼續。

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

  3. 點選新增媒體庫,從/media目錄選擇掛載的影片目錄

  4. 設定要自動抓取的中繼資料,中繼資料就是影片的說明、演員、發行年份的資訊,可維持預設,之後能手動編輯。

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

  1. 設定中繼資料語言為正體中文。不過抓取到的資料我自己感覺還是很大程度會含有簡體字。

3. Jellyfin使用方式
#

3.1. 啟用GPU硬體解碼
#

Jellyfin預設使用CPU解碼影片。啟用GPU硬體解碼(Hardware Acceleration)可讓影片串流處理速度更快。

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

就顯示卡而言,Jellyfin支援Intel/AMD/Nvidia的加速技術, 官方文件有詳細說明。

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

  2. 將使用者加入video群組

sudo usermod -aG video root
sudo usermod -aG video $USER
  1. 編輯docker-compose.yml,在最下面加入使用Nvidia顯示卡
version: '3'
services:
  jellyfin:
    image: jellyfin/jellyfin
    container_name: jellyfin
    user: root:root
    network_mode: 'host'
    volumes:
      - "./config:/config"
      - "./cache:/cache"
      - "/home/user/Movies:/media:ro"
      - "/home/user/Music:/media2:ro"
    restart: 'unless-stopped'
    environment:
      - JELLYFIN_PublishedServerUrl=http://example.com
    extra_hosts:
      - "host.docker.internal:host-gateway"
    # 使用Nvidia的顯示卡硬體加速
    runtime: nvidia
    deploy:
      resources:
        reservations:
          devices:
            - 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顯示卡啟用QSV/VA-API硬體解碼 (點選展開)

VA-API硬體解碼幾乎所有Intel GPU皆支援。QSV則是要Haswell架構CPU(第四代)以後才支援。

儘管開發者說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:
version: '3'
services:
  jellyfin:
    image: jellyfin/jellyfin
    container_name: jellyfin
    user: root:root
    # 填入render群組的ID
    group_add:
      - "989"
    network_mode: 'host'
    volumes:
      - "./config:/config"
      - "./cache:/cache"
      - "/home/user/Movies:/media:ro"
      - "/home/user/Music:/media2:ro"
      - "/home/user/Comics:/media3:ro"
    restart: 'unless-stopped'
    environment:
      - JELLYFIN_PublishedServerUrl=http://example.com
    extra_hosts:
      - "host.docker.internal:host-gateway"
    # 使用Intel的顯示卡硬體加速
    devices:
      - /dev/dri/renderD128:/dev/dri/renderD128
  1. 檢查容器能否印出Intel解碼器版本
sudo docker exec -it jellyfin /usr/lib/jellyfin-ffmpeg/vainfo
  1. 檢查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這類工具查看顯示卡使用率就知道了。

3.2. 啟用資料夾檢視
#

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

3.3. 自訂佈景主題
#

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

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

3.4. 新增其他Jellyfin使用者
#

進入Jellyfin首頁,點選左邊選單開啟「控制台」,在「使用者」頁面新增使用者。

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

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

3.5. 多人同步觀看同一部影片
#

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

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

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

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

4. 在手機和電視觀看Jellyfin媒體庫
#

如果您覺得網頁版效能不好,可以安裝電腦版Jellyfin客戶端。

手機平台也有很多APP支援Jellyfin,這邊介紹的是Jellyfin官方出的APP客戶端,支援Android和iOS系統,還有Android TV版。

  1. 首先讓手機和電腦處於同一Wifi網路下。如果是不同網段可看下一節「外部網路存取」的作法。

  2. 電腦輸入ip addr查看區域IP,通常是192.168開頭

enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    inet 192.168.1.103/24 brd 192.168.1.255 scope global dynamic noprefixroute enp2s0
  1. 下載Jellyfin APP: Android版 iOS版 Android TV版 電腦版

  2. 開啟後輸入http://電腦區域IP:8096,登入帳號

  3. 停用電池優化就能鎖定螢幕後繼續播放。

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

要怎麼從不同網段存取家中的電腦呢?

  1. 安裝並設定ZeroTier,將電腦和手機加入虛擬區域網路

  2. 防火牆開啟8096 TCP通訊埠。

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

相關文章

雲端音樂播放器Navidrome,自架音樂串流伺服器
Linux系統 Self-hosting自架 Media Server
架設Nextcloud個人雲端硬碟 + 網頁版LibreOffice教學 (docker-compose + ZeroTier內網穿透)
Linux系統 Self-hosting自架 Nextcloud LibreOffice Media Server
Linux系統用Docker跑ZeroTier One,進行內網穿透
Linux系統 Self-hosting自架 ZeroTier Docker

留言板

此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。要討論程式碼請用Giscus,匿名討論請用Disqus。

這是Giscus留言板,需要Github帳號才能留言。支援markdown語法,若要上傳圖片請貼Imgur連結。您的留言會在Github Discussions向所有人公開。

這是Disqus留言板,您可能會看到Disqus強制投放的廣告。有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。