これまでにMirakurunとEPGStationで録画サーバの構築方法を記事にしてきました。
録画ファイルをNASに保存するようにしておけば、家のどこからでも録画番組を視聴できるようになります。
基本的には、録画して→視聴して→消すの繰り返しで問題ないのですが、忙しかったり録画することに満足したりで、見ることなく録画番組が貯まってしまう場合があります。
テレワーク(在宅勤務)になって時間ができたはずなのに、録画ファイルが貯まっていくのはナゼだろう・・
このまま放置していくとストレージを圧迫するので、私はときどき録画ファイルの容量を小さくするために録画ファイルをエンコードします。
ちなみにエンコードはffmegを使うのですが、方法によっては時間とCPUパワー(電力)をそこそこ消費します。
EPGStationのデフォルトのエンコード設定はソフトウェアエンコードなので、非力なサーバだとCPUの負荷が高くなり、時間(とお金)もかかります。
私のサーバもどちらかと言えば非力なマシンということもあり、基本的にはエンコードせずにやりくりしています。
そうはいっても、エンコードすることもあるので今回は、時間とお金を節約するエンコードについて記事にしてみたいと思います。
せっかくなので、EPGStationのコンテナをカスタマイズしてみます。
まあ、私の場合はエンコードしても結局見ずに消すことになるんですけど。
ちなみに、以下の記事でもVAAPIエンコード可能な録画環境構築手順について解説しています。
この記事は、現行(9/12)のEPGStationで構築したコンテナをハードウェアエンコードができるようにする手順です。
もはや自己満足の領域です。お好みでどうぞ。
Contents
時間とお金を節約するエンコードって?
ずはり、ハードウェアエンコードです。
EPGStationの標準コンフィグで設定されているエンコード設定(ソフトウェアエンコード)ではなく、ハードウェアアクセラレーションを活用したエンコード(ハードウェアエンコード)に挑戦してみます。
ちなみに、一言で「ハードウェアエンコード」と言っても、使ってるCPUやビデオカードによって使うライブラリが異なります。
今回記事にするハードウェアエンコードは、私のサーバ(LIVAZ)でも試せるということで、 比較的最近のIntel製CPUで利用できるVAAPIを使ってみたいと思います。
ちなみに、ハードウェアエンコードにはQSVもあり、VAAPIとQSVを混同した情報が溢れていますが、VAAPI=QSVではありません。
細かいですが、i965を使ったエンコードになるので、今回は、あくまでVAAPIということで。
私のサーバ
ハードウェア
私のサーバは、LIVA Z n4200です。
スペックは一部拡張していて、以下となっています。
- ECS LIVA Z(n4200)CPU n4200 (QSV/vaapiに対応)
- eMMC 64GB(Windows領域のため使用していない)
- 拡張ストレージ SSD 120GB(加えて、外付けHDD 16TBあります)
- メモリ 16GB
ソフトウェア
今回はUbuntu 18.04LTSで構築してみます。
Debian系OSなら手順は同じです。
未検証ですが、新しい20.04LTSでも同様と思います。
構築手順
前提
前提として、最新版(9/12時点)のEPGStationが構築済みであることとします。
docker-compose.ymlの修正
VAAPIをdockerコンテナ内で利用するために、ホストのデバイスをコンテナと共有します。
ホストのデバイスをコンテナと共有するために、docker-compose.ymlを修正します。
1 2 |
cd ~/docker-mirakurun-epgstation emacs docker-compose.yml |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
version: '3' services: mirakurun: build: context: Mirakurun dockerfile: docker/Dockerfile image: chinachu/mirakurun:latest cap_add: - SYS_ADMIN - SYS_NICE ports: - "40772:40772" - "9229:9229" volumes: - /etc/localtime:/etc/localtime:ro - ./Mirakurun/config/:/app-config/ - ./Mirakurun/data/:/app-data/ environment: TZ: "Asia/Tokyo" devices: - /dev/bus:/dev/bus - /dev/px4video0:/dev/px4video0 - /dev/px4video1:/dev/px4video1 - /dev/px4video2:/dev/px4video2 - /dev/px4video3:/dev/px4video3 restart: always logging: driver: json-file options: max-file: "1" max-size: 10m mysql: image: mariadb:10.4 volumes: - mysql-db:/var/lib/mysql environment: MYSQL_USER: epgstation MYSQL_PASSWORD: epgstation MYSQL_ROOT_PASSWORD: epgstation MYSQL_DATABASE: epgstation TZ: "Asia/Tokyo" command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci --performance-schema=false --expire_logs_days=1 restart: always logging: options: max-size: "10m" max-file: "3" epgstation: build: context: epgstation args: - CPUCORE=2 volumes: - /etc/localtime:/etc/localtime:ro - ./epgstation/config:/app/config - ./epgstation/data:/app/data - ./epgstation/thumbnail:/app/thumbnail - ./epgstation/logs:/app/logs - /path/to/storage:/app/recorded environment: TZ: "Asia/Tokyo" devices: - /dev/dri:/dev/dri depends_on: - mirakurun - mysql ports: - "8888:8888" - "8889:8889" #user: "1000:1000" restart: always volumes: mysql-db: driver: local |
修正箇所は以下です。
- 64~65行目:devicesを追記
参考:Intel(VAAPI)ドライバ
今回は、Intelのi965-va-driverを使用します。
幸いなことに、i965-va-driverはUbuntuでは現在標準ドライバとなっていて、自分でインストールする必要はありません。
Dockerfileの修正
VAAPI対応のffmpegをビルドするために、Dockerfileを修正します。
1 |
emacs epgstation/Dockerfile |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
FROM l3tnun/epgstation:master-debian EXPOSE 8888 ARG CPUCORE="1" ENV DEV="make gcc git g++ automake curl wget autoconf build-essential libass-dev libfreetype6-dev libsdl1.2-dev libtheora-dev libtool libva-dev libvdpau-dev libvorbis-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev pkg-config texinfo zlib1g-dev" ENV FFMPEG_VERSION=4.1 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 && \ echo "deb http://http.us.debian.org/debian stable main contrib non-free" | tee -a /etc/apt/sources.list && \ apt update && \ apt-get -y install i965-va-driver-shaders && \ \ #ffmpeg build \ mkdir /tmp/ffmpeg_sources && \ cd /tmp/ffmpeg_sources && \ wget http://ffmpeg.org/releases/ffmpeg-${FFMPEG_VERSION}.tar.bz2 -O ffmpeg.tar.bz2 && \ tar xjvf ffmpeg.tar.bz2 && \ cd /tmp/ffmpeg_sources/ffmpeg* && \ ./configure \ --prefix=/usr/local \ --disable-shared \ --pkg-config-flags=--static \ --enable-gpl \ --enable-libass \ --enable-libfreetype \ --enable-libmp3lame \ --enable-libopus \ --enable-libtheora \ --enable-libvorbis \ --enable-libvpx \ --enable-libx264 \ --enable-libx265 \ --enable-nonfree \ --disable-debug \ --disable-doc \ --enable-vaapi \ && \ cd /tmp/ffmpeg_sources/ffmpeg* && \ make -j${CPUCORE} && \ make install && \ \ # 不要なパッケージを削除 \ apt-get -y remove $DEV && \ apt-get autoremove -y && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* && \ rm -rf /tmp/ffmpeg_sources |
修正箇所は以下です。
- 12~14行目:i965-va-driver-shadersのpkgをインストール
- 40行目:ffmpegのビルド時にvaapiを有効化
事前準備はここまで。
コンテナ起動
実行中のEPGStationのDockerコンテナを停止して、再ビルドします。
1 |
docker-compose build --no-cache epgstation && docker-compose up -d epgstation |
30分程かかりますので、コーヒーでも淹れてまったりします。
ハードウェアエンコード
コンテナ内では、VAAPIエンコードが可能な状態になっています。
エンコードのサンプルとして、./recorded/hogehoge.m2tsを./recorded/hogehoge.mp4にハードウェアエンコードしてみます。
試しに以下のコマンドでエンコードしてみます。
パラメータはお好みで追加してください。
1 |
ffmpeg -vaapi_device /dev/dri/card0 -hwaccel vaapi -hwaccel_output_format vaapi -i ./recorded/hogehoge.m2ts -vf 'format=nv12|vaapi,hwupload,deinterlace_vaapi,scale_vaapi=w=1280:h=720' -c:v h264_vaapi -c:a ac3 -qp 20 ./recorded/hogehoge.mp4 |
録画ファイルの大きさにもよりますが、サクサクエンコードがされていることが分かります。
もし、エンコード時にエラーを吐くようなら、-vaapi_device /dev/dri/card0の部分を-vaapi_device /dev/dri/renderD128としてみてください。
CPUの負荷は25%前後。
録画ファイルの容量も、おおよそ4割程度に圧縮できました。
あとは、EPGStationのコンフィグにこれをベースにしてコマンドを修正してやれば、録画後の自動エンコードや、リアルタイムエンコード視聴等が可能です。
これでよし
EPGStationからエンコードする方法は、以下の記事を参考にしてください。
まとめ
この記事では、EPGStationのコンテナをVAAPIエンコード可能にする方法について紹介しました。
EPGStationからエンコードする方法は、以下の記事を参考にしてください。
個人的には、録画環境としてはもうこれ以上改善することがないくらいの完成度&安定性だと思っています。
あるとすれば予約ルールをjsonファイルでエクスポート/インポートできるように対応してほしいことくらいでしょうか。
まあ、個人的な利用状況からの要望なので、本質的ではないですが。
今回も参考になれば幸いです。
コメント