藍圖風格插畫:底片流進雙風扇顯示卡,轉成一個播放鍵

Jellyfin 教學:用舊顯卡打造自己的 Netflix

用 Docker 架 Jellyfin,讓主機裡的舊 GTX 1650 負責硬體轉檔:驅動怎麼選、Docker 怎麼用顯卡、轉碼怎麼設,以及怎麼證明真的是顯卡在轉檔。

Jellyfin 是開源、免費的影音串流伺服器,可以想成自己架的 Netflix:影片放在家裡的主機,用 Android TV、手機 App 或瀏覽器看,會自動抓海報和簡介。

這篇記錄我在舊電腦上用 Docker 架 Jellyfin,並讓主機裡的 GTX 1650 負責轉檔。

整個過程都是遠端做的,版本以 2026 年 10 月為準。前情見〈不買 NAS、不重灌:人不在家,把舊電腦升級成家庭影音中心〉。

為什麼需要硬體轉檔

網路慢,或設備不支援某種影片格式時,Jellyfin 要即時把影片轉成較小、較通用的格式,這叫轉檔(轉碼)。

交給 CPU 做會很吃力,交給顯卡裡的硬體編碼器就輕鬆很多。

我的 i5-9400F 沒有內建顯示,用不了 Intel 的 Quick Sync。好在主機裡本來就有一張 GTX 1650,它的硬體編碼器(NVENC)可以:

  • 硬體解碼 H.264、HEVC(含 10-bit)、VP9
  • 即時編碼成 H.264、HEVC
  • 不支援 AV1

這張卡的編碼器是比較舊的一代,畫質比新卡略差,但串流完全夠用。

第一步:安裝 NVIDIA 驅動

先確認 Secure Boot 有沒有開。開著的話,裝完驅動重開機時要在主機螢幕前確認一次,遠端就做不完。我的結果是關閉,所以全程遠端:

mokutil --sb-state

如果先跑 nvidia-smi,系統會說找不到指令、建議你裝 nvidia-utils-xxx。這是陷阱:那只是查詢工具,不是驅動,單裝它沒用。要先查可用的驅動版本,這行也會顯示你的顯卡型號:

ubuntu-drivers devices

清單裡有十幾個版本,我選的是 nvidia-driver-595-server-open:

  • 595:和系統推薦的同一代,在這版 Ubuntu 上測試得最完整
  • server:伺服器長期維護版,更新比較保守,適合要穩定跑的機器
  • open:NVIDIA 開源版核心模組,這一代顯卡起官方建議用它
sudo apt install nvidia-driver-595-server-open
sudo reboot
# 重開後確認
nvidia-smi

重開機後,n8n 也因為 Docker 的自動重啟設定自己恢復。裝好驅動後顯卡閒置會進入 P8 省電狀態,只有約 7W。

遠端執行 nvidia-smi 後,Claude 確認驅動 595.91.07 裝好、GTX 1650 閒置在 P8 省電狀態約 7W

第二步:讓 Docker 用得到顯卡

Docker 容器預設看不到顯卡,要另外裝 NVIDIA Container Toolkit。照 NVIDIA 官方安裝說明加入官方 apt 套件庫並安裝,再設定 Docker:

sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
# 開一個測試容器,裡面應該看得到顯卡
sudo docker run --rm --gpus all ubuntu nvidia-smi
sudo docker image rm ubuntu

第三步:用 Docker 架 Jellyfin

我把 Jellyfin 放在 /opt/jellyfin,不放個人家目錄。Ubuntu 預設每個人的家目錄只有本人能進,放 /opt 才能讓兩個帳號都用 sudo 管理。compose.yaml 的重點是:

  • network_mode: host:不用 Docker 的 port 對應,讓 Ubuntu 的防火牆管得到,8096 port 只開給家裡和 Tailscale
  • runtime: nvidia,加上 deploy.resources.reservations.devices 把顯卡交給容器
  • 環境變數 NVIDIA_DRIVER_CAPABILITIES=all
  • 影片資料夾掛到容器裡的 /media
cd /opt/jellyfin
sudo docker compose up -d

第四步:開啟硬體轉碼

用瀏覽器打開 Jellyfin,跟著設定精靈建立管理員帳號。接著到「控制台 → 播放 → 轉碼」:

  • 硬體加速:NVIDIA NVENC
  • 硬體解碼勾選:H264、HEVC、MPEG2、VC1、VP8、VP9、HEVC 10bit、VP9 10bit。AV1 不要勾,GTX 1650 不支援
  • 啟用硬體編碼、允許 HEVC 編碼、啟用色調映射

我在手機上找不到這個頁面。手機版的控制台有兩層選單,要在控制台裡再按一次 ☰ 才會展開。最快的方法是直接在網址後面加 /web/#/dashboard/playback/transcoding。

手機上的 Jellyfin 轉檔設定:硬體加速選 Nvidia NVENC,勾選要硬體解碼的格式,AV1 不勾

第五步:建立媒體庫

影片資料夾和檔名用「片名 (年份)」的格式,例如 Movie (2020)/Movie (2020).mkv,Jellyfin 才抓得到海報和簡介。

我建了「電影」和「節目」兩個媒體庫。放進去的影片要是自己合法取得的。

我放了測試影片之後,Jellyfin 卻是空的,原因是媒體庫還沒建立。排查時一段一段縮小範圍:檔案在不在、容器看不看得到,都確認沒問題,問題就在 Jellyfin 的設定。

影片跟 n8n 的備份放在同一顆硬碟,不要把硬碟塞滿,否則每天的備份會失敗。

沒有影片?自己產生一段測試片

本來想下載開源動畫 Big Buck Bunny 當測試片,結果官方網址改版出現 404,還留下一個 0 位元組的空檔(下載失敗時也會產生,記得刪掉)。

後來改用 Jellyfin 內建的 ffmpeg 自己產生:2 分鐘的 1080p 彩色測試畫面加嗶聲,116MB,不用網路、不怕來源失效:

sudo -u 你的使用者名稱 mkdir -p "/mnt/backup/media/movies/Test Pattern (2026)"
sudo docker exec -u 1000 jellyfin /usr/lib/jellyfin-ffmpeg/ffmpeg \
  -f lavfi -i testsrc2=size=1920x1080:rate=30 -f lavfi -i sine=frequency=440 \
  -t 120 -c:v libx264 -preset veryfast -b:v 8M -c:a aac -shortest \
  "/media/movies/Test Pattern (2026)/Test Pattern (2026).mp4"

怎麼證明真的是顯卡在轉檔

在手機上把測試片設成低畫質播放(例如 720p),強迫 Jellyfin 轉檔。

我一開始在播放時跑 nvidia-smi,完全看不到任何程序,以為顯卡沒在工作。其實是 2 分鐘的短片顯卡幾秒就轉完,程序早就結束了。

改看 Jellyfin 的轉檔紀錄。又踩一個坑:紀錄裡出現 libx264(CPU 轉檔),但那只是 ffmpeg 開頭印出的功能清單。精準的查法是只抓實際使用的編碼器那一行:

sudo grep -ohE -- '-codec:v:0 [a-z0-9_]+' /opt/jellyfin/config/log/FFmpeg.Transcode-*.log

出現 hevc_nvenc 或 h264_nvenc 是顯卡,libx264 是 CPU。我三次測試都是 hevc_nvenc。

查詢 Jellyfin 轉檔紀錄,三次都是 hevc_nvenc,Claude 確認是 GTX 1650 在轉檔

在 Android TV 上看

電視從 Google Play 安裝 Jellyfin App,伺服器位址輸入 http://主機IP:8096。我家是雙層 NAT,電視的「自動搜尋伺服器」找不到主機,手動輸入 IP 就好。

這是舊電腦家用伺服器系列的第 7 篇。

上一篇:〈Tailscale 教學:出門也能安全連回家,和 Cloudflare 怎麼分工〉;

下一篇〈File Browser+Samba:手機和電腦都能用的私人雲端硬碟〉已經上架,寫的是用 File Browser 和 Samba 讓手機和電腦都能存取主機上的檔案。