実機で試してから書く、自宅サーバーの部活動 2026-09-22 TUE / 記事 14 本

ホーム記事一覧 › ミニPCでJellyfinメディアサーバーを立てる:Intel QSVでハードウェアトランスコードを有効にする手順

Jellyfin

ミニPCでJellyfinメディアサーバーを立てる:Intel QSVでハードウェアトランスコードを有効にする手順

公開 2026-09-21読了 6 分

Photo: Andrey Matveev / Pexels

この記事でわかること
ミニPCのJellyfinでCPU使用率が跳ね上がる原因はトランスコードです。/dev/driの受け渡しからQSVの設定、動作確認と詰まりどころまでを順に整理します。

Jellyfin を Docker で立てるところまでは、十数分で終わります。困るのはそのあとです。スマホから再生したら映像がカクつき、サーバーの CPU が張り付いたまま戻らない。ミニPCの自宅サーバーで最初にぶつかるのが、ほぼこれです。

原因はトランスコードです。そして解決策は、Intel の iGPU に仕事を渡すことです。先に結論を書きます。

/dev/dri をコンテナへ渡す → 管理画面で QSV を選ぶ → Low-Power エンコードを有効にする。 この 3 つで、CPU で回していた変換が iGPU に移ります。ただしその前に、そもそもトランスコードを走らせないほうが速いという話も押さえておいてください。

まずトランスコードが走る条件を知る

Jellyfin の再生には 3 つの形があります。

何をしているかサーバーの負荷
ダイレクト再生ファイルをそのまま渡すほぼゼロ
リマックス中身は変えず容器だけ詰め替える軽い
トランスコード映像を作り直す重い

重いのは 3 つめだけです。そして、トランスコードが走る典型はこの 4 つです。

  • クライアントが HEVC(H.265)や AV1 に対応していない
  • 画像ベースの字幕(Blu-ray の PGS、DVD の VOBSUB)を表示しようとしている
  • クライアント側で画質・ビットレートの上限を指定している
  • 音声コーデックだけ非対応(この場合は音声のみの変換で済むことが多い)

2 番目が見落とされがちです。画像字幕は映像に焼き込む必要があるため、コーデックが合っていても問答無用でトランスコードになります。

用意するもの:Intel iGPU 搭載のミニPC

QSV(Quick Sync Video)は Intel の内蔵グラフィックスに載っている機能です。ここ数年のミニPCで人気の N100 は Gen12 世代の iGPU を積んでおり、HEVC の 10bit デコードや AV1 のデコード、H.264 / HEVC のエンコードに対応しているとされています。家庭用のメディアサーバーとしては十分な範囲です。

一方で、AV1 でエンコードしたい場合は Arc 系の GPU が必要とされています。手元のファイルを AV1 に作り直す用途までは、N100 クラスでは想定しないほうがよいです。

省電力のミニPCを 24 時間動かす前提なら、この世代を選んでおけば困りません。

ステップ1:ホスト側で /dev/dri を確認する

Ubuntu Server などホスト側で、まずデバイスが見えているか確かめます。

ls -l /dev/dri
getent group render

renderD128 が表示されれば iGPU は認識されています。getent のほうは render:x:989: のような行が返るので、この数字(GID)を控えておきます。環境によって値が違うので、記事に書かれた番号をそのまま使ってはいけません。

/dev/dri が空、あるいは存在しない場合は、BIOS で内蔵グラフィックスが無効になっている可能性があります。ディスプレイを繋がない運用だと、機種によっては iGPU が起動しない設定になっていることがあります。BIOS の Primary Display や IGD の項目を見直してください。

ステップ2:Docker Compose で GPU を渡す

公式イメージには専用ビルドの jellyfin-ffmpeg とドライバーが同梱されているので、ホスト側に追加のパッケージを入れる必要は基本的にありません。

services:
  jellyfin:
    image: jellyfin/jellyfin:latest
    container_name: jellyfin
    restart: unless-stopped
    network_mode: host
    devices:
      - /dev/dri:/dev/dri
    group_add:
      - "989"          # ステップ1で控えた render の GID
    volumes:
      - ./config:/config
      - ./cache:/cache
      - /srv/media:/media:ro

ポイントは 2 つです。devices でデバイスを渡すだけでは足りず、group_add で権限も渡すこと。そしてメディア本体は :ro(読み取り専用)でマウントすることです。ライブラリを読むだけなら書き込み権限は要りません。

network_mode: host はクライアントからの自動検出のために使っています。ポートを絞りたい場合は 8096 の公開に変えても動きます。

ステップ3:コンテナの中から見えているか確かめる

設定画面をいじる前に、ここで一度確認します。順番を逆にすると、切り分けが面倒になります。

docker exec -it jellyfin /usr/lib/jellyfin-ffmpeg/vainfo

iHD ドライバーの名前と、VAProfileH264Main などのプロファイル一覧がずらっと出れば成功です。

Permission denied が返る場合は、ほぼ GID の不一致です。ステップ1 で確認した番号と group_add の値が合っているか見直してください。イメージを入れ替えたときに GID が変わることもあります。

ステップ4:管理画面で QSV を有効にする

ダッシュボードの 再生 → トランスコード を開きます。

  • ハードウェアアクセラレーション: Intel QuickSync (QSV)
  • QSV デバイス: /dev/dri/renderD128
  • ハードウェアデコードを有効にする: H264 / HEVC / VP9 にチェック。AV1 は対応世代のみ
  • ハードウェアエンコードを有効にする: オン
  • 低電力エンコーダー(Low-Power / VDENC)を有効にする: Gen11 以降はオン

低電力エンコーダーは、ディスプレイを繋がないヘッドレス構成でも安定して動く経路として推奨されています。ただし相性が出ることもあるので、再生できないときに最初に切ってみる項目として覚えておいてください。

HDR の作品を SDR のクライアントで見るなら トーンマッピングも有効にします。こちらは処理が重い部類なので、同時再生が増える環境では挙動を見ながら決めます。

ステップ5:本当に GPU で動いているか見る

設定を入れただけで満足すると、実は CPU で回っていた、ということが起こります。確認方法は 2 つです。

ひとつは Jellyfin のダッシュボードの「再生中」の欄です。トランスコード中のセッションに (hw)Transcoding (hw) といった表記が付きます。

もうひとつはホスト側から見る方法です。

sudo intel_gpu_top

再生中に Video / VideoEnhance のエンジンが動いていれば、確実に iGPU が使われています。intel-gpu-tools パッケージに入っています。

わざとトランスコードを起こしたいときは、クライアント側の品質設定を元ファイルより低いビットレートに落として再生すると分かりやすいです。

詰まったときに見る順番

  • /dev/dri が無い → BIOS の iGPU 設定を疑う
  • vainfo が Permission deniedgroup_add の GID
  • 再生が始まらない / 緑や紫の画面になる → Low-Power エンコードを切って再試行
  • 常にトランスコードされる → 字幕を疑う。画像字幕を外部の SRT に差し替えると解消することがあります
  • 音声だけ変換されている → 想定内。負荷は小さいので放置で構いません

そもそも変換させない運用が一番軽い

QSV を有効にしても、トランスコードがゼロになるわけではありません。負荷を根本的に下げたいなら、方向は 2 つです。

ひとつはクライアント側を対応させること。テレビの Jellyfin アプリや対応プレイヤーを使えばダイレクト再生になり、サーバーはファイルを流すだけになります。

もうひとつはライブラリのコーデックを揃えること。家族全員の端末で確実に再生したいなら、容量と引き換えに H.264 で持つという選択もあります。

どちらにしても、メディアサーバーは容量が効いてくる用途です。NAS 用の CMR HDDを最初から余裕のある容量で入れておくほうが、あとで詰め替えるより楽になります。

まとめ

  • Jellyfin が重いのはトランスコードが走っているときだけ。まず走る条件(非対応コーデック・画像字幕・ビットレート制限)を疑います
  • 手順は /dev/dri 確認 → Compose で devicesgroup_addvainfo で確認 → 管理画面で QSV の 4 つです
  • group_add の GID は環境ごとに違うので、getent group render で必ず自分の値を確認します
  • 設定後はダッシュボードの (hw) 表記か intel_gpu_top で、実際に iGPU が動いているか見ます
  • 映らない・緑になるときは、Low-Power エンコードを切るのが最初の一手です
  • N100 クラスは H.264 / HEVC のエンコードまで。AV1 エンコードは別物と考えます

CPU が張り付いていたのが嘘のように静かになるので、ファンの音でストレスを感じていた人ほど効果が分かりやすい設定です。


運営者が作った Excel テンプレートを BOOTH で配布しています。IT 資産管理台帳(無料 Lite 版あり) / IT 資格の学習管理シート

部長(本業: IT インフラ) 家でも同じことをして遊んでいます。記事は実機で試してから書き、失敗もそのまま載せます。