エンコード サーバー

[ハードウェアエンコード/VAAPI] 2021年版 Linux録画環境構築 その4 [Chinachu/EPGStation]

投稿日:

前回調べた VAAPI によるハードウェアエンコードを Chinachu/EPGStation に適用する。


 

Chinachu

Chinachu は元々 vaapi によるハードウェアエンコードの枠組みがあるので、それを微調整して使う。
 

config.json

  • "vaapiEnabled": true
  • "vaapiDevice": "/dev/dri/renderD128" などの使用するデバイスファイル
  • "gid": vaapi に用いるデバイスファイルのグループID
     私の場合は /dev/dri/renderD128 を用い、このファイルのグループは render
     /etc/group によると render の ID は 109 なので、109 を指定した。

    Google Adsense

実行オプション最適化

専ら録画してから、録画済みの番組を後から視聴するので、
chinachu/api/script-recorded-program-watch.vm.js のみを修正。
必要に応じて、channel-watch とか recording-program-watch なども合わせて。
下記以外は、WebUI からの引数などもあるので基本的に Chinachu のデフォルトコードをそのままで活用している。
 

hwaccel_output_format=vaapi

下準備での解説の通り。
ハードウェア(vaapi)系フィルタに直結させるなら vaapi 形式のままでよい。

 

scale_vaapi

こちらも下準備での説明の通り。
1080p のまま素通しさせる場合は、明示的にフィルタを通さない。

scale_vaapi=h=720:w=-2 のように高さだけの指定で、元の比率で等倍指定でもよいかも。
 

ビデオフィルタ(vf)の整理

こちらも下準備での説明の通り。

 

明示的に iHD を使わせる

Chinachu から呼ばれた ffmpeg が iHD/i965 のいずれを使っているかわかりにくいので、実行時環境を明示的に指定する。

 

その他

chinachu/usr/bin/ffmpeg などが別途入れたシステムの ffmpeg を指すようにしてあった。
公式にも同梱ffmpeg は削除してビルド必須と書かれているが、
ffmpeg で --hwaccels, --encoders--codecs の出力を見る限り、
同梱の ffmpeg でも通るような気がするが、未確認。

Google Adsense

EPGStation

コンテナ内の EPGStation は VAAPI によるハードウェアエンコードには対応していないので、
Dockerfile 内で対応した環境, ffmpeg などを用意してやる。
 

docker-compose.yml

vaapi に用いるデバイスファイルをコンテナ内に見せる。

 

epgstation/Dockerfile

下準備で説明したように、コンテナ内でVAAPI環境を構築し、vaapi対応ffmpeg をビルドする。

Google Adsense

epgstation/config/enc.js

録画時のエンコードはこちらで設定、それ以外は別途 config.json で設定(後述)。
デフォルトの enc.js をベースに vaapi ハードウェアエンコード用に enc_vaapi.js を作成。

Google Adsense

明示的に iHD を使わせる

EPGStation でも明示的に iHD を使うようにさせる。

 

config.json

WebUI 側から使うための設定。
私の場合は、EPGStation では基本的に録画時にエンコードまでやってしまうので、encodeliveHLS の設定のみ。
生ts で保存する場合は、recordedHLS も変更するとよい。

[注意] 2021/01 に EPGStation v2 がリリースされ、これらの設定は config.yml で行われるようになった。
まだ v2.0系ということで私は未導入のため、これらの記述は v1系用のものとなります。

 

デバイスファイルの権限設定

実はここが一番すっきりしていないのところなのだが、
私の環境では EPGStation はユーザー権限で動く rootless-docker 内で稼働している。
このユーザーをデバイスファイルのグループである renderに追加しても、
コンテナ内ので VAAPI ハードウェアエンコードが上手く動作しない。

そのため systemd で rc-local.service 的なものを作って、
その中で chmod 666 /dev/dri/renderD128 としている。
# /etc/udev/rules.d/~.rules でやるのがまともなやり方だと思います。
これで起動時に用いるデバイスファイルの権限が 666 となる。
セキュリティ的にはザルになっているのでどうなのか分からないが、
ひとまずこれで動作するようになった。
普通の docker や、システムに直接 EPGStation を入れた場合は不要かもしれない。
 

Known Issue

BS系(?) or ソースのビットレートが高い(?)時に vaapi によるハードウェアエンコードが失敗する。
そのため EPGStation では別途 enc_software.js を用意して、そちらも指定できるようにした。
 

Google Adsense

-エンコード, サーバー
-, , , , , ,

Copyright© P-Life, 2022 All Rights Reserved.