【LowCodeでつくる】Raspberry PiとDocker + EPGStation + mirakurunで地デジサーバ構築

# TL;DR
地デジサーバ構築の手法はたくさんありますが、バージョンが古かったりしてうまく稼働しないことが多かったので現時点で安定運用できている方法をここに残しておきます。

# 用意するもの
## 必須
- RaspberryPi 4 （手元にあるのはRAM2GBモデルですが、個人的には4GBや8GBを推奨します）
- PX-S1UD（USB接続型地デジアンテナ）
- アンテナケーブル
- B-CASカード
- SCM3310/v2.0（B-CASカード読み込み用）
- 外付けHDD（録画用）

## 任意
- アンテナ分配器（アンテナ端子が１つしかない場合に使用します）

# 構築手順
- 基本的には酢ろぐ！さんの記事(https://blog.ch3cooh.jp/entry/2021/04/06/200732) の通りにコマンドを叩いてセットアップすれば問題ありません。RaspberryPiでハードウェアエンコーディングを利用してリアルタイム視聴を有効化する設定については記載がないため、この記事で紹介します。

## リアルタイム視聴とエンコード時間の短縮設定

### リアルタイム視聴設定
- `ffmpeg` を `apt` でインストールします。
```
$ sudo apt -y install ffmpeg
```

- インストール後、 `/data/docker-mirakurun-EPGStation/epgStation/config/config.yml`のファイルの

```
- stream:
    live:
        ts:
            mp4:
```

に

```
- name: h264_omx
                  cmd:
                      "%FFMPEG% -re -i pipe:0 -threads 0 -c:a copy -bsf:a aac_adtstoasc -c:v h264_omx -vb 3000k -movflags frag_keyframe+empty_moov+faststart+default_base_moof -y -f mp4 pipe:1"
```
を追加するとH.264によるリアルタイム視聴が有効になり、EPGStation上で選べるようになります。

- VSCodeを利用している場合はSSHクライアント（左下のボタンが緑色になっているあれ）の利用がおすすめです。
- 最終的には`h264_omx`の追加後、以下のようになっていればOKです。

```:config.yml
stream:
    live:
        ts:
            m2ts:
                - name: 720p
                  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 libx264 -vf yadif,scale=-2:720 -b:v 3000k -preset veryfast -y -f mpegts pipe:1'
                - name: 480p
                  cmd:
                      '%FFMPEG% -re -dual_mono_mode main -i pipe:0 -sn -threads 0 -c:a aac -ar 48000 -b:a 128k -ac 2
                      -c:v libx264 -vf yadif,scale=-2:480 -b:v 1500k -preset veryfast -y -f mpegts pipe:1'
                - name: 無変換

            webm:
                - name: 720p
                  cmd:
                      '%FFMPEG% -re -dual_mono_mode main -i pipe:0 -sn -threads 3 -c:a libvorbis -ar 48000 -b:a 192k -ac
                      2 -c:v libvpx-vp9 -vf yadif,scale=-2:720 -b:v 3000k -deadline realtime -speed 4 -cpu-used -8 -y -f
                      webm pipe:1'
                - name: 480p
                  cmd:
                      '%FFMPEG% -re -dual_mono_mode main -i pipe:0 -sn -threads 2 -c:a libvorbis -ar 48000 -b:a 128k -ac
                      2 -c:v libvpx-vp9 -vf yadif,scale=-2:480 -b:v 1500k -deadline realtime -speed 4 -cpu-used -8 -y -f
                      webm pipe:1'

            mp4:
                - name: 720p
                  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 libx264 -vf yadif,scale=-2:720 -b:v 3000k -profile:v baseline -preset veryfast -tune
                      fastdecode,zerolatency -movflags frag_keyframe+empty_moov+faststart+default_base_moof -y -f mp4
                      pipe:1'
                - name: 480p
                  cmd:
                      '%FFMPEG% -re -dual_mono_mode main -i pipe:0 -sn -threads 0 -c:a aac -ar 48000 -b:a 128k -ac 2
                      -c:v libx264 -vf yadif,scale=-2:480 -b:v 1500k -profile:v baseline -preset veryfast -tune
                      fastdecode,zerolatency -movflags frag_keyframe+empty_moov+faststart+default_base_moof -y -f mp4
                      pipe:1'
                - name: h264_omx
                  cmd:
                      "%FFMPEG% -re -i pipe:0 -threads 0 -c:a copy -bsf:a aac_adtstoasc -c:v h264_omx -vb 3000k -movflags frag_keyframe+empty_moov+faststart+default_base_moof -y -f mp4 pipe:1"

```
### エンコード時間の短縮設定（主に録画用）
- `/data/docker-mirakurun-EPGStation/epgStation/config/enc.js`のファイルを次のように手直しします。

```javascript:enc.js
// 14 行目あたりの codec を h264_omx に変更
// const codec = 'libx264';
const codec = 'h264_omx';
// 40 行目あたり、その他設定の直前にビットレートの指定を追加
Array.prototype.push.apply(args, ['-b:v', '3000k']);
```
- 設定が完了したらRaspberryPiを再起動してしばらく待ちましょう。
- しばらく待ってから、http://<ラズパイのローカルIP>:8888 にアクセスしてEPGStationが起動できるか確認しましょう。
- 正常に起動したら、左上の「三」から「放映中」を選び、チャンネルを選ぶと、「WebM」「720p」それぞれのプルダウンがあるウィンドウが表示されます。
- 「WebM」のプルダウンで「MP4」を選ぶと、「720p」のプルダウンで「h264_omx」が選べるようになっていればOKです。

- ⚠️iPhoneのブラウザはリアルタイム視聴非対応です。ご了承ください。