【2021年8月版】Raspberry Pi 3 Model B+ & Mirakurun & EPGStationで地デジ録画サーバー構築

#はじめに
2021年8月9日時点でRaspberry Pi 3 Model B+を使用して問題なく録画サーバーを構築できた方法を備忘録として残しておきます。
確認していませんが、参考にした記事ではRaspberry Pi 4で動作していたので4でも動くと思います。

この記事ではMirakurunとEPGStationを使って地上波の録画やストリーミングができるサーバーを構築していきます。

##⚠注意事項⚠
実際に構築する際には自己責任にてお願いします。
TS抜きはグレーな位置にあるのでその点理解できる方のみこの先の手順に進んでください。
テレビ番組のコピー、アップロードは違法です。録画した番組は私的利用の範囲に留めてください。
この記事の手順を実施した際に発生した損害等に対していかなる理由があっても筆者は一切責任を負いません。

#使用した機器
##[Raspberry Pi 3 Model B+](https://www.monotaro.com/p/4101/7157/?utm_id=g_pla&utm_medium=cpc&utm_source=Adwords&utm_campaign=246-833-4061_6466659573&utm_content=77481173956&utm_term=_380615429419__aud-368712506548:pla-888444747587&gclid=CjwKCAjwpMOIBhBAEiwAy5M6YOSixynd572kBpf42uAD4AAjfLC-piXrRkifvulRbxYCFznDU334yRoChCoQAvD_BwE)
今回は家にあったので3B+を使用しましたが、今から買うのであれば[Raspberry Pi 4 Model B](https://www.monotaro.com/p/5196/3389/)を購入したほうが良いでしょう。
##[PX-S1UD V2.0](https://www.amazon.co.jp/dp/B0141NFWSG/ref=cm_sw_r_tw_dp_B87ZZYN78ZSDT2527HY1)
PX-Q1UDでも大丈夫です（内部でPX-S1UDが4つつながっているだけなので）
他のPLEX社のUSB接続のものでもいけると思いますが、ドライバが違うのでそこは臨機応変に対応してください。
##[SCR3310v2.0](https://www.amazon.co.jp/dp/B0085H4YZC/ref=cm_sw_r_tw_dp_G41VK9KSHKKH3KPG3Q25)
B-CASが読めるカードリーダーです。ほとんどの記事でこの型番のものを使っているので特に理由がなければこの型番のものを購入したほうが良いと思います。
##B-CASカード
これ無しでは地デジの信号は復号できません。（できることもありますが法に触れる可能性があるのでやめておいたほうが良いです）
手元に無い場合、[こちらのサイト](https://www.b-cas.co.jp/cardorder/view/order/agreement.html)から2160円で再発行することができます。
##アンテナ線や分配器
今回筆者はテレビやレコーダーを設置していない部屋に録画サーバーを設置したので分配器は使いませんでしたが、テレビやレコーダーがある部屋に設置する場合は分配器が必要になります。
分配器と分波器は別物なので購入する際、よく見て購入してください。
分配器を使用すると信号が弱くなるので映らない場合はブースターを用意して受信できる環境にしてください。
##外付けHDD
今回筆者は余っていた2.5インチSATAHDDをUSB接続のHDDケースに入れて使用しましたが特に理由がなければ外部電源ありかつ電源連動しないものを選ぶと安定して動作すると思います。
Raspberry Piは電源がUSBの5Vの電源で動いているので外部機器に電力を取られるとサーバーとして必要な電力を賄えなくなる可能性があるためです。
##セルフパワー式のUSBハブ
HDD選びでも説明したとおりRaspberry Piは電源が非常に弱いので、チューナーやカードリーダーの接続もセルフパワー式のUSBハブで電力のサポートをするとより安定すると思います。
筆者はELECOMの[U2H-AN4SBK](https://www.amazon.co.jp/dp/B01IB5HH6U/ref=cm_sw_r_tw_dp_G9NZZXWTR6G0HM5B8DQ3?_encoding=UTF8&psc=1)を選びました（安かったので）
Raspberry Pi 4を使用する場合はUSB3.0に対応しているのでUSB3.0対応のものを選ぶと良いと思います。
#Raspberry Pi OSのセットアップ
##OSインストール
今回はRaspberry Pi Imager v1.6.2（最新版）を使用します
OSは「Raspberry Pi OS (other)」から「Raspberry Pi OS Lite (32-bit)」を選択し、書き込むストレージを選択します。
書き込む前に`Ctrl + Shift + X`を押して下のような「Advanced options」の画面を出します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570508/3b7098e1-5cfb-b085-63bd-523e9930fe00.png)
家に複数のRaspberry Piがある場合は「Set hostname:」にチェックを入れてかぶらないような名前をつけます。
`[指定した名前].local`でSSHに接続するので覚えておきましょう。（デフォルトは`raspberrypi.local`）

「Enable SSH」にチェックを入れてパスワード認証か鍵認証か選んで選んだ方に必要な情報を入力します。
パスワード認証の場合、ユーザー名`pi`のパスワードをここで決めます。

「Configre wifi」の設定はWi-Fiに接続する場合のみ設定します。有線LANの場合は必要ありません。
無線LAN接続で使用する場合は自動で再接続するようにするなど起動後にいろいろと設定が必要になります。
ここでは解説しませんので他の方の記事を参考に設定を行ってください。

「Set locale settings」にチェックを入れて地域とキー配列の設定をします。
「Time zone:」の設定でタイムゾーンの設定を住んでいる地域に合わせます。
「Keyboard layout:」の設定でキー配列を使っているキーボードに合わせて設定します。

設定が終わったら「SAVE」をクリックして「WRITE」で書き込みます。

書き込みが完了したらRaspberry Pi本体にSDカードを差し込み、電源とLANケーブル、使用する周辺機器を接続して起動します。
しばらく待ってから`[指定した名前].local`と指定したログイン方法でSSH接続します。
ここで接続できない場合はディスプレイを繋いで設定するか書き込みからやり直してみてください。
##IPアドレスの固定
SSHでログインできたらまずIPアドレスを固定します。

```
sudo nano /etc/dhcpcd.conf
```

以下のように設定する項目のコメントアウトを外して固定したいIPアドレスとルーターのIPアドレス、DNSサーバーのIPアドレスを入力します。

```/etc/dhcpcd.conf
# Example static IP configuration:
interface eth0
static ip_address=192.168.0.81/24
#static ip6_address=fd51:42f8:caae:d92e::ff/64
static routers=192.168.0.1
static domain_name_servers=192.168.0.1 8.8.8.8
```

##ユーザーの設定
今回はデフォルトの`pi`ユーザーをそのまま使います。別のユーザーを使いたい人は臨機応変に対応してください。
ユーザーをvideoグループに所属させます。

```
sudo adduser pi video
```

##更新
OSの書き込みからパッケージの更新をしていない場合はここで一度更新しておきます。

```
sudo apt update && apt upgrade -y
```

更新が終わったら一度再起動しておきます。

再起動が終わるとIPアドレスが固定されているはずなので固定したIPアドレスでログインします。
ここでログインできなかった場合はIPアドレスの固定からやり直してみてください。

#SDカード保護
今回はファイルシステム変更等はせず、簡単にできる範囲でログやスワップの抑制をしていきます。
できるだけ抑えたいという人は他の方の記事を参考に設定してください。
##ログの抑制

```
sudo nano /etc/rsyslog.conf
```

以下の項目をコメントアウトします。

```/etc/rsyslog.conf
#cron.*                         /var/log/cron.log
#daemon.*                       -/var/log/daemon.log
#kern.*                         -/var/log/kern.log
#lpr.*                          -/var/log/lpr.log
#mail.*                         -/var/log/mail.log
#user.*                         -/var/log/user.log
#mail.info                      -/var/log/mail.info
#mail.warn                      -/var/log/mail.warn
#mail.err                       /var/log/mail.err
```

##スワップの無効化

```
sudo swapoff --all
sudo apt remove dphys-swapfile
```

ここまでできたら一度再起動しておきます。
#HDDの設定
NASに保存したい場合は他の人の記事を参考に設定してください。
##HDDの確認

```
sudo fdisk -l | grep /dev/sd
```

ここで保存したいHDDがどこに認識されているか覚えておきます。（例：`/dev/sda`）
##パーティション作成
フォーマットすると中身全部消えるので先に消えても良い状態にしておきましょう。

```
sudo fdisk /dev/sda
```

`Command (m for help):`と出たら`d`,`n`,`w`の順でコマンドを実行します。
設定は基本デフォルトで大丈夫です。
##ext4でフォーマット

```
sudo mkfs.ext4 /dev/sda
```

`/dev/sda`のところは環境に合わせて変更してください。
##自動マウント設定
HDDのUUIDをメモしておきます。

```
sudo blkid /dev/sda
```

HDDが`/mnt/hdd`にマウントされるように設定します。

```
sudo nano /etc/fstab
```

末尾に以下を追加します。

```
UUID=設定したいUUID /mnt/hdd ext4 nofail 0 0
```

一度再起動してマウントできているか確認します。

```
df -h | grep /mnt/hdd
```

##ディレクトリの権限変更
`/mnt/hdd`の権限を変更します。

```
sudo chown pi:video /mnt/hdd
```

#Sambaの設定
録画したファイルを見るためにSambaを設定します。
NASに直接保存する場合飛ばしても構いません。
##インストール

```
sudo apt install -y samba
```

##設定
録画したファイルを保存するディレクトリはまだありませんが、接続確認のため設定しておきます。

```
sudo nano /etc/samba/smb.conf
```

末尾に以下の設定を追加

```/etc/samba/smb.conf
[任意の名前]
   comment = 任意のコメント
   path = 接続確認に使うディレクトリ(迷ったら/mnt/hddで)
   guest ok = yes
   read only = no
   browsable = no
   force user = pi
```

追加したらSambaを再起動します。

```
sudo service smbd restart
```

##接続確認
`\\ラズパイのIPアドレス\設定した名前\`で接続できるかどうか確認します。
#H.264ハードウェアエンコードの設定
録画後に自動でエンコードするようにするため、ハードウェアエンコードを使えるようにしておきます。

```
echo 'SUBSYSTEM=="vchiq",GROUP="video",MODE="0666"' | sudo tee /etc/udev/rules.d/10-vchiq-permissions.rules
```

#FFmpegのインストール
エンコードのためにFFmpegをインストールします。

```
sudo apt install -y ffmpeg
```

`ffmpeg -encoders | grep h264`を実行して`h264_omx`があることを確認しておきます。
#チューナーのドライバインストール
PX-S1UDもPX-Q1UDも同じドライバで動きます。

```
wget http://plex-net.co.jp/plex/px-s1ud/PX-S1UD_driver_Ver.1.0.1.zip
unzip PX-S1UD_driver_Ver.1.0.1.zip
sudo cp PX-S1UD_driver_Ver.1.0.1/x64/amd64/isdbt_rio.inp /lib/firmware/
```

再起動してからデバイスが認識しているか確認します。

```
dmesg | grep PX-S1UD
```

#カードリーダーのドライバインストール

```
sudo apt install -y build-essential pcscd libpcsclite-dev libccid pcsc-tools
```

インストールが終わったらB-CASカードが読み取れるか確認します。

```
sudo pcsc_scan
```

`Japanese Chijou Digital B-CAS Card (pay TV)`みたいなのが出れば大丈夫です。
確認できたら`Ctrl + C`で終了します。

#B-CASデコード用ライブラリのインストール
[こちら](https://github.com/stz2012/libarib25)を使います。

```
sudo apt install -y git cmake g++
git clone https://github.com/stz2012/libarib25
cd libarib25
cmake .
make
sudo make install
```

#録画コマンドのインストール
録画コマンドとしてrecdvbをインストールします。
##インストール

```
sudo apt install -y automake
wget http://www13.plala.or.jp/sat/recdvb/recdvb-1.3.2.tgz
tar xvzf recdvb-1.3.2.tgz
cd recdvb-1.3.2
./autogen.sh
./configure --enable-b25
EXTRA_SID=1 make
sudo make install
```

##動作確認
この時点でコマンドによる録画はできるようになっているはずです。
以下のコマンドで録画できるか確認します。

```
recdvb --b25 --strip --dev 0 物理チャンネル番号 秒数 /Sambaで共有しているディレクトリ/test.m2ts
```

物理チャンネルは[こちらのリスト](https://www.maspro.co.jp/contact/bro/bro_ch.html)から探してみてください。
録画が成功するとSambaで共有しているディレクトリに録画したファイルが保存されているはずなので再生して録画できているか確認します。
#Dockerインストール
MirakurunとEPGStationを動かすためにDockerをインストールします。
Node.jsを使う方法もありますがうまく行かなかったので今回はDockerを使います。
##Dockerのインストール

```
curl -sSL https://get.docker.com | sh
```

##Python3のインストール

```
sudo apt install -y python3-pip
```

##Docker Composeのインストール

```
pip3 install docker-compose
```

#MirakurunとEPGStationのセットアップ
[こちら](https://github.com/l3tnun/docker-mirakurun-epgstation)のリポジトリを使います。
書き込み量が多くなるのでHDDに移動してから実行する方が良いと思います。

ソースファイルを取得

```
git clone https://github.com/CH3COOH/docker-mirakurun-epgstation.git
sudo chown pi:pi docker-mirakurun-epgstation
```

Configファイルをコピー

```
cd docker-mirakurun-epgstation
cp epgstation/config/operatorLogConfig.sample.yml epgstation/config/operatorLogConfig.yml
cp epgstation/config/epgUpdaterLogConfig.sample.yml epgstation/config/epgUpdaterLogConfig.yml
cp epgstation/config/serviceLogConfig.sample.yml epgstation/config/serviceLogConfig.yml
```

Docker Composeでビルド

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

ここで結構時間がかかるので(30分以上)しばらく待ちます。

完了したら`http://ラズパイのIPアドレス:8888`にアクセスしてEPGStationが動作していることを確認します。

録画をNASに直接保存する場合はここでMirakurunの設定から保存先をNASに指定してください。
#Mirakurunのチャンネルスキャン
Mirakurunには自動でチャンネルをスキャンする機能があるのでやっておきます。
関東以外の地域でスキャンするとデフォルトで入っている関東の局がリストに入ってしまうのでこの後の手順で手動で設定します。

```
curl -X PUT "http://raspberrypi.local:40772/api/config/channels/scan"
```

一度コンテナを再起動しておきます

```
sudo docker-compose down
sudo docker-compose up -d
```

#Mirakurunのチャンネル設定
チャンネルスキャンだけでは不完全な場合が多いので手動で設定していきます。
ブラウザから`http://ラズパイのIPアドレス:40772`にアクセスしてMirakurunの設定画面を出します。
「Config」内の「Channels」をクリックして以下のようなチャンネル設定画面を出します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570508/4e3e12d3-1259-e7d3-92a6-b072a90b91d1.png)
「Name」に放送局の名前、「Type」に`GR`、「Channel」に物理チャンネルを設定します。
「Enable」で項目の有効/無効を切り替えられます。
物理チャンネルは[こちら](https://www.maspro.co.jp/contact/bro/bro_ch.html)のリストから探してください。

設定したら「Save」で保存し、「Restart」でMirakurunを再起動します。
チャンネル設定が合っているかどうかはVLCメディアプレイヤー等のストリーミング再生機能で
`http://ラズパイのIPアドレス:40772/api/channels/GR/物理チャンネル/stream/`
にアクセスすることで確認できます。

すべてのチャンネルが設定できるまで設定と確認を繰り返すと完了です。
不要なチャンネルは無効にして設定の順番をリモコンの順番と合わせるとわかりやすくて良いと思います。

設定が終わったらVLC等で
`http://ラズパイのIPアドレス:40772/api/iptv/playlist`
に接続してプレイリストにすべてのチャンネルが反映されていて切り替えができるかどうか確認します。

すべてのチャンネルが正常に視聴できればチャンネル設定は完了です。
##チャンネル設定の例（三重県北部コミュファ光テレビの場合）
1  東海テレビ　　　　  物理21
2  NHKEテレ・名古屋　物理13
3  NHK総合・津 　　　物理28
4  中京テレビ  　　 　　物理19
5  CBCテレビ　　　　  物理18
6  メ～テレ　　　　　 物理22
7  三重テレビ　　　　 物理27
8  NHK総合・名古屋　 物理20
10 テレビ愛知　　　　物理23
#EPGStationの動作確認
`http://ラズパイのIPアドレス:8888`でEPGStationにアクセスします。
Mirakurunのチャンネル設定が正常に完了している状態でしばらくするとEPGStationに番組表が生成されていくはずです。
番組表の受信には時間がかかるのでしばらく待って確認しましょう。
一晩待っても表示されない場合どこかがおかしいのでこれまでの設定を見直してみてください。
#Sambaの共有ディレクトリ設定
Mirakurunの設定により録画したファイルを保存するディレクトリが生成されたのでそのディレクトリをSambaで共有します。
NASに直接保存する場合は必要ありません。

```
sudo nano /etc/samba/smb.conf
```

pathを書き換えて共有するディレクトリを変更します。

```/etc/samba/smb.conf
path = /mnt/hdd/docker-mirakurun-epgstation/recorded
```
再起動して設定を適応

```
sudo service smbd restart
```

適当な番組を録画してみて保存されたファイルが見れるかどうか確認しておきましょう。
スマホやPC等様々なデバイスから録画した番組が見れるはずです。
#おわりに
今回筆者はRaspberry Pi 3 Model B+を使いましたが、ストリーミングの遅延は2～3秒ほどで録画もしっかりとこなしてくれました。
チャンネル切り替えはテレビの数倍時間がかかりますがこんなもんかと割り切って使っています。
筆者の家にはRaspberry Pi 3 Model Bで構築したVPNサーバーがあるので外でもネット回線さえちゃんとしていればテレビが見れたり録画予約できるようになりました。
とても便利なのでラズパイが余ったていたら構築してみても良いかもしれません。

質問や修正点等あればコメントください。
それでは、読んでいただきありがとうございました。