Open6

録画実験サーバ on Docker on N100 でハードウェアエンコーディングで VP9 を使いたい

YetAnother_ykYetAnother_yk

ファイルサイズを小さくしたいのでデフォルトであった設定と記憶している H.264 から変更する

N100 のハードウェアエンコーダー
https://zenn.dev/voluntas/scraps/1bd3ca021935fe

chatGPT に相談したら H.265 (HEVC) か VP9。
基本的には H.265 (HEVC) がおすすめだけれど、VP9 は止めはしない(ロイヤリティフリーだし、オープンソースとか好きなら使えば?)って感じだった。
天邪鬼なので VP9 を使う。

YetAnother_ykYetAnother_yk

もういちいち調べながらやるのはめんどくさいので、chatGPT に相談してコピペ→エラーが出たら調べる方式。
ライセンス等々問題があるかも知れないので自己責任でお願いします(でも問題あるってことは教えていただけると嬉しいです)。

YetAnother_ykYetAnother_yk

ホストへ依存パッケージのインストール

ホスト OS は arch linux なので以下インストール:

yay -S intel-media-driver libva-utils

VP9 のハードウェアエンコーディングができるか確認:

$ vainfo | grep 'VAEntrypointEncSlice'
error: can't connect to X server!
(中略)
      VAProfileVP9Profile0            :	VAEntrypointEncSliceLP
      VAProfileVP9Profile1            :	VAEntrypointEncSliceLP
      VAProfileVP9Profile2            :	VAEntrypointEncSliceLP
      VAProfileVP9Profile3            :	VAEntrypointEncSliceLP
(後略)
YetAnother_ykYetAnother_yk

Dockerfile の編集

epgstation の Dockerfile を編集する

Dockerfile
 RUN apt-get update && \
     apt-get -y install $DEV && \
     apt-get -y install yasm libx264-dev libmp3lame-dev libopus-dev libvpx-dev && \
     apt-get -y install libx265-dev libnuma-dev && \
     apt-get -y install libasound2 libass9 libvdpau1 libva-x11-2 libva-drm2 libxcb-shm0 libxcb-xfixes0 libxcb-shape0 libvorbisenc2 libtheora0 libaribb24-dev && \
+    apt-get -y install libcrypto++8 vainfo intel-media-va-driver && \
 \
 #ffmpeg build
     mkdir /tmp/ffmpeg_sources && \

libcrypto++8 は元々追加していたので念のため残しているが、何のために入れたか今となっては不明

YetAnother_ykYetAnother_yk

コンテナ内で VP9 ハードウェアエンコーディングが利用できるか確認する

↑の Dockerfile の編集が済んだら、以下実行:

docker compose up -d --build --force-recreate

エラーが出なければ 👌
早速コンテナ内でハードウェアアクセラレーションの確認をする:

$ docker compose exec epgstation bash
root@9dd3581dba46:/app# vainfo | grep 'VAEntrypointEncSlice'
error: XDG_RUNTIME_DIR is invalid or not set in the environment.
error: can't connect to X server!
libva info: VA-API version 1.17.0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_17
libva info: va_openDriver() returns 0
(中略)
      VAProfileVP9Profile0            :	VAEntrypointEncSliceLP
      VAProfileVP9Profile1            :	VAEntrypointEncSliceLP
      VAProfileVP9Profile2            :	VAEntrypointEncSliceLP
      VAProfileVP9Profile3            :	VAEntrypointEncSliceLP
(後略)

なんかエラーとか出ているけれど、きっと大丈夫

YetAnother_ykYetAnother_yk

ffmpegのVAAPIサポートの確認

引き続きコンテナ内で作業:

root@9dd3581dba46:/app# ffmpeg -encoders | grep vaapi
ffmpeg version 7.0 Copyright (c) 2000-2024 the FFmpeg developers
(中略)
 V....D vp9_vaapi            VP9 (VAAPI) (codec vp9)

とても良さそう