ハードウェアエンコード可能なEPGStationをDockerで構築する方法~VAAPIで高速エンコード~

自宅サーバー

これまでにMirakurunとEPGStationで録画サーバの構築方法を記事にしてきました。

録画ファイルをNASに保存するようにしておけば、家のどこからでも録画番組を視聴できるようになります。

基本的には、録画して→視聴して→消すの繰り返しで問題ないのですが、忙しかったり録画することに満足したりで、見ることなく録画番組が貯まってしまう場合があります。

私

テレワーク(在宅勤務)になって時間ができたはずなのに、録画ファイルが貯まっていくのはナゼだろう・・

このまま放置していくとストレージを圧迫するので、私はときどき録画ファイルの容量を小さくするために録画ファイルをエンコードします。

ちなみにエンコードはffmegを使うのですが、方法によっては時間とCPUパワー(電力)をそこそこ消費します。

EPGStationのデフォルトのエンコード設定はソフトウェアエンコードなので、非力なサーバだとCPUの負荷が高くなり、時間(とお金)もかかります。

私のサーバもどちらかと言えば非力なマシンということもあり、基本的にはエンコードせずにやりくりしています。

そうはいっても、エンコードすることもあるので今回は、時間とお金を節約するエンコードについて記事にしてみたいと思います。

せっかくなので、EPGStationのコンテナをカスタマイズしてみます。

私

まあ、私の場合はエンコードしても結局見ずに消すことになるんですけど。

ちなみに、以下の記事でもVAAPIエンコード可能な録画環境構築手順について解説しています。

この記事は、現行(9/12)のEPGStationで構築したコンテナをハードウェアエンコードができるようにする手順です。

私

もはや自己満足の領域です。お好みでどうぞ。

時間とお金を節約するエンコードって?

ずはり、ハードウェアエンコードです。

EPGStationの標準コンフィグで設定されているエンコード設定(ソフトウェアエンコード)ではなく、ハードウェアアクセラレーションを活用したエンコード(ハードウェアエンコード)に挑戦してみます。

ちなみに、一言で「ハードウェアエンコード」と言っても、使ってるCPUやビデオカードによって使うライブラリが異なります。

今回記事にするハードウェアエンコードは、私のサーバ(LIVAZ)でも試せるということで、 比較的最近のIntel製CPUで利用できるVAAPIを使ってみたいと思います。

ECS 小型デスクトップパソコン LIVAZ-8/240-W10Pro(N4200)TS

ちなみに、ハードウェアエンコードにはQSVもあり、VAAPIとQSVを混同した情報が溢れていますが、VAAPI=QSVではありません。

細かいですが、i965を使ったエンコードになるので、今回は、あくまでVAAPIということで。

ハードウェアビデオアクセラレーション - ArchWiki

私のサーバ

ハードウェア

私のサーバは、LIVA Z n4200です。

スペックは一部拡張していて、以下となっています。

  • ECS LIVA Z(n4200)CPU n4200 (QSV/vaapiに対応)
    • eMMC 64GB(Windows領域のため使用していない)
    • 拡張ストレージ SSD 120GB(加えて、外付けHDD 16TBあります)
    • メモリ 16GB

ECS 小型デスクトップパソコン LIVAZ-8/240-W10Pro(N4200)TS

ソフトウェア

今回はUbuntu 18.04LTSで構築してみます。

Debian系OSなら手順は同じです。

未検証ですが、新しい20.04LTSでも同様と思います。

構築手順

前提

前提として、最新版(9/12時点)のEPGStationが構築済みであることとします。

docker-compose.ymlの修正

VAAPIをdockerコンテナ内で利用するために、ホストのデバイスをコンテナと共有します。

ホストのデバイスをコンテナと共有するために、docker-compose.ymlを修正します。

修正箇所は以下です。

  • 64~65行目:devicesを追記

参考:Intel(VAAPI)ドライバ

今回は、Intelのi965-va-driverを使用します。

幸いなことに、i965-va-driverはUbuntuでは現在標準ドライバとなっていて、自分でインストールする必要はありません。

Dockerfileの修正

VAAPI対応のffmpegをビルドするために、Dockerfileを修正します。

修正箇所は以下です。

  • 12~14行目:i965-va-driver-shadersのpkgをインストール
  • 40行目:ffmpegのビルド時にvaapiを有効化
私

事前準備はここまで。

コンテナ起動

実行中のEPGStationのDockerコンテナを停止して、再ビルドします。

私

30分程かかりますので、コーヒーでも淹れてまったりします。

ハードウェアエンコード

コンテナ内では、VAAPIエンコードが可能な状態になっています。

エンコードのサンプルとして、./recorded/hogehoge.m2tsを./recorded/hogehoge.mp4にハードウェアエンコードしてみます。

試しに以下のコマンドでエンコードしてみます。

パラメータはお好みで追加してください。

録画ファイルの大きさにもよりますが、サクサクエンコードがされていることが分かります。

もし、エンコード時にエラーを吐くようなら、-vaapi_device /dev/dri/card0の部分を-vaapi_device /dev/dri/renderD128としてみてください。

CPUの負荷は25%前後。

録画ファイルの容量も、おおよそ4割程度に圧縮できました。

あとは、EPGStationのコンフィグにこれをベースにしてコマンドを修正してやれば、録画後の自動エンコードや、リアルタイムエンコード視聴等が可能です。

私

これでよし

EPGStationからエンコードする方法は、以下の記事を参考にしてください。

まとめ

この記事では、EPGStationのコンテナをVAAPIエンコード可能にする方法について紹介しました。

EPGStationからエンコードする方法は、以下の記事を参考にしてください。

個人的には、録画環境としてはもうこれ以上改善することがないくらいの完成度&安定性だと思っています。

あるとすれば予約ルールをjsonファイルでエクスポート/インポートできるように対応してほしいことくらいでしょうか。

まあ、個人的な利用状況からの要望なので、本質的ではないですが。

今回も参考になれば幸いです。

コメント

タイトルとURLをコピーしました