EPGStation で Raspberry Pi のハードウェアエンコーダーを使う

愛用していた nasne 本体が壊れてしまったので、Raspberry Pi と地デジチューナーで nasneモドキを自作しました。
以下の記事が大変参考になりました。

* [【2021年8月版】Raspberry Pi 3 Model B+ & Mirakurun & EPGStationで地デジ録画サーバー構築](https://qiita.com/sunset0916/items/e97b90b23872ca3ca0cd)

上記の記事に従って作業すれば良いと思いますが、現時点(2022年7時月下旬)ではいくつか差分があったので、メモします。

* ホストOSへの「FFmpegのインストール」は不要
  * ffmpeg は EPGStation コンテナ内で動作するから
  * ffmpeg が h264_omx を使えるように設定する(後述)
* ホストOSへの「カードリーダーのドライバインストール」は不要
  * カードリーダーにアクセスするのは、Mirakurunのコンテナだと思う
  * 少なくとも、私はこのステップを省略した
* 以下のステップも実施しなかった
  * 「B-CASデコード用ライブラリのインストール」
  * 「録画コマンドのインストール」
* 「Docker Composeのインストール」は不要
  * docker に compose プラフインが入るようになっているから

## 環境

```bash
$ uname -m
armv7l
$ cat /proc/device-tree/model
Raspberry Pi 3 Model B Plus Rev 1.3
$ docker --version
Docker version 20.10.17, build 100c701
```

## docker-compose.yml

変更点は以下の通りです。

* Raspberry Pi OS 32bit で動作する MySQLのイメージに変更
* コンテナから h264_omx を使えるするようにするための変更　以下を追加
　　* - /opt/vc/lib:/opt/vc/lib:ro
　　* - /dev/vchiq:/dev/vchiq

```bash
$ diff docker-compose-sample.yml docker-compose.yml
27,28c27
<         image: mariadb:10.5
<         # image: mysql:8.0 # 囲み文字を使用する場合
---
>         image: hypriot/rpi-mysql
49a49
>             - /opt/vc/lib:/opt/vc/lib:ro
54c54,55
<             - ./recorded:/app/recorded
---
> #            - ./recorded:/app/recorded
>             - /home/samba/minidlna/movie:/app/recorded
64c65,66
< #         devices:
---
>         devices:
>             - /dev/vchiq:/dev/vchiq
```

## debian.Dockerfile

epgstation コンテナでビルドする ffmpeg で、h264_omx が動作するように、Dockerfile を変更します。

```bash
$ git diff
diff --git a/epgstation/debian.Dockerfile b/epgstation/debian.Dockerfile
index e602650..4c37fc5 100644
--- a/epgstation/debian.Dockerfile
+++ b/epgstation/debian.Dockerfile
@@ -3,10 +3,13 @@ FROM l3tnun/epgstation:master-debian
 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.2.4

+# Path to OpenMAX hardware encoding libraries. They are part of Raspberry Pi firmware.
+ENV LD_LIBRARY_PATH=/opt/vc/lib
+
 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 libx265-dev libnuma-dev libomxil-bellagio-dev && \
     apt-get -y install libasound2 libass9 libvdpau1 libva-x11-2 libva-drm2 libxcb-shm0 libxcb-xfixes0 libxcb-shape0 libvorbisenc2 libtheora0 libaribb24-dev && \
 \
 #ffmpeg build
@@ -27,6 +30,8 @@ RUN apt-get update && \
       --enable-libvpx \
       --enable-libx264 \
       --enable-libx265 \
+      --enable-omx \
+      --enable-omx-rpi \
       --enable-version3 \
       --enable-libaribb24 \
       --enable-nonfree \
```

## EPGStation の config.yml

h264_omx でエンコードする設定を追加します。

```bash
$ diff config.yml config.yml.template
107,112d106
<                 - name: h264_omx
<                   cmd:
<                       '%FFMPEG% -re -dual_mono_mode main -i pipe:0 -sn -threads 0 -c:a aac -ar 48000 -b:a 192k -ac 2
<                       -c:v h264_omx -b:v 5000k
<                       -movflags frag_keyframe+empty_moov+faststart+default_base_moof -y -f mp4
<                       pipe:1'
155,160d148
<                       pipe:1'
<                 - name: h264_omx
<                   cmd:
<                       '%FFMPEG% -dual_mono_mode main -i pipe:0 -sn -threads 0 -c:a aac -ar 48000 -b:a 192k -ac 2
<                       -c:v h264_omx -b:v 5000k
<                       -movflags frag_keyframe+empty_moov+faststart+default_base_moof -y -f mp4
```

## 出来上がり

```bash
$ docker compose run --rm -e SETUP=true mirakurun
$ docker compose up -d
```

ビットレートを 5Mbps に設定しましたが、CPU使用率 50% 以下で動作しており、快適です。

## 参考

* https://github.com/CH3COOH/docker-mirakurun-epgstation