【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+

今回は家にあったので3B+を使用しましたが、今から買うのであればRaspberry Pi 4 Model Bを購入したほうが良いでしょう。

PX-S1UD V2.0

PX-Q1UDでも大丈夫です(内部でPX-S1UDが4つつながっているだけなので)
他のPLEX社のUSB接続のものでもいけると思いますが、ドライバが違うのでそこは臨機応変に対応してください。

SCR3310v2.0

B-CASが読めるカードリーダーです。ほとんどの記事でこの型番のものを使っているので特に理由がなければこの型番のものを購入したほうが良いと思います。

B-CASカード

これ無しでは地デジの信号は復号できません。(できることもありますが法に触れる可能性があるのでやめておいたほうが良いです)
手元に無い場合、こちらのサイトから2160円で再発行することができます。

アンテナ線や分配器

今回筆者はテレビやレコーダーを設置していない部屋に録画サーバーを設置したので分配器は使いませんでしたが、テレビやレコーダーがある部屋に設置する場合は分配器が必要になります。
分配器と分波器は別物なので購入する際、よく見て購入してください。
分配器を使用すると信号が弱くなるので映らない場合はブースターを用意して受信できる環境にしてください。

外付けHDD

今回筆者は余っていた2.5インチSATAHDDをUSB接続のHDDケースに入れて使用しましたが特に理由がなければ外部電源ありかつ電源連動しないものを選ぶと安定して動作すると思います。
Raspberry Piは電源がUSBの5Vの電源で動いているので外部機器に電力を取られるとサーバーとして必要な電力を賄えなくなる可能性があるためです。

セルフパワー式のUSBハブ

HDD選びでも説明したとおりRaspberry Piは電源が非常に弱いので、チューナーやカードリーダーの接続もセルフパワー式のUSBハブで電力のサポートをするとより安定すると思います。
筆者はELECOMのU2H-AN4SBKを選びました(安かったので)
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」の画面を出します。

家に複数の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デコード用ライブラリのインストール

こちらを使います。

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

物理チャンネルはこちらのリストから探してみてください。
録画が成功すると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のセットアップ

こちらのリポジトリを使います。
書き込み量が多くなるので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」をクリックして以下のようなチャンネル設定画面を出します。

「Name」に放送局の名前、「Type」にGR、「Channel」に物理チャンネルを設定します。
「Enable」で項目の有効/無効を切り替えられます。
物理チャンネルはこちらのリストから探してください。

設定したら「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サーバーがあるので外でもネット回線さえちゃんとしていればテレビが見れたり録画予約できるようになりました。
とても便利なのでラズパイが余ったていたら構築してみても良いかもしれません。

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