Myuu’s Trashcan  

jellyfin-qsv

JellyfinでIntel QSVでのエンコードに失敗するときの対処

Linux

Create2024-05-12 02:59:17
Last Update2024-05-12 02:59:17


TL;DR

JellyfinでIntel QSVによるH.264, HEVCエンコードを有効にすると,一部の条件下で動画のストリーミングができなくなった.

これはデフォルトでHuCが有効になっておらず,一部のHWエンコーディングのみが有効となっていることが原因である.
カーネルパラメータにてHuC Firmwareのロードを有効化することで解消する.

環境

  • OS
    • TrueNAS SCALE 24.04
  • Jellyfin
    • TrueChartでの導入
    • TrueChartsのアプリケーションはk3s上で動作
    • HW TranscodeのためiGPUを割り当て
  • CPU/GPU
    • Intel Core i7-9700K
    • Intel UHD Graphics 630

エラー詳細

HEVCやVP9,Apple ProResなどでエンコードした動画を,これらのDirect Playに対応しないクライアントへストリーミングする際に発生(対応形式へのTranscodeが行われるため)
JellyfinのUI上では「サーバー・クライアントが対応した形式にできない」的な文面が表示される(うろ覚えで凄い適当)

以下のようなTranscodeのログが残っていた.

...
[h264_qsv @ 0x55f9ad49e8c0] Selected ratecontrol mode is unsupported
[h264_qsv @ 0x55f9ad49e8c0] some encoding parameters are not supported by the QSV runtime. Please double check the input parameters.
Error initializing output stream 0:0 -- Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height
Conversion failed!

調べていると,以下のエントリを発見.

これによると,カーネルパラメータに i915.guc_enable=2 を追加することで解消するケースがあるよう.

GuC/HuC

詳細はArchWikiを参照すべし

第9世代 Core以降のGPUに搭載されたgraphics micro controllerとのこと.HEVCなどのエンコードをを専用コントローラへオフロードしたりする.
第12世代 Core以前では,Linuxにおいてこれがデフォルト無効のため,カーネルパラメータで有効化する必要がある.

上記のi915.guc_enable=2はHuCファームウェアのロードを有効にするもので,第9世代以降が対応している.

HuCファームウェアロードの有効化

通常のLinux環境であれば,GRUBなどのbootloaderの設定で上記パラメーターを設定すれば良い.
/etc/modprobe.d以下に設定を置いても良いだろう.

TrueNASではGRUBの設定を書き換えても,システム更新があると永続化できないため,少し方法が異なる.

以下のコマンドでデータベースエントリを追加し,再起動

midclt call system.advanced.update '{"kernel_extra_options": "`i915.guc_enable=2"}'

すると再起動時にこれがGRUBのパラメータへ反映される.

ロードされたかはdmesgで確認

[    5.300401] i915 0000:00:02.0: [drm] GT0: GuC firmware i915/kbl_guc_70.1.1.bin version 70.1.1
[    5.300425] i915 0000:00:02.0: [drm] GT0: HuC firmware i915/kbl_huc_4.0.0.bin version 4.0.0

これで問題無くTranscodeが効くようになった.