Raspberry Pi 4 で録画サーバーを作った (Mirakurun + EPGStation)
ブログは移動したので,最新のを見る場合は下記のリンクを参照。
Raspberry Pi 4 で録画サーバーを作った.
Raspberry Pi 4 Model B 4GB + Mirakurun + EPGStation で録画鯖作った
— hiroxto (@hiroxto) 2020年3月3日
FFmpeg 周りまだ何も手つけてないけどとりあえず録画は出来たっぽい pic.twitter.com/oSlgPnk7mB
使用したハードウェア
Raspberry Pi 4 Model B 4GB
メモリの使用量的には 2GB モデルでも平気だと思うけど, とりあえず 4GB なら間違いない. 2GB モデルの値段が安くなったけども, メモリが余る分には困らないし, 4GB がおすすめ.
Miuzei Raspberry Pi 4 ケース
電源なしのを購入. 1000 円ちょっとで ケース + ファン + ヒートシンクが揃っていい感じ.
PLEX PX-Q1UD
TV チューナー. 4 チャンネル同時視聴・録画可能な方 (PX-Q1UD) を買ったけど, そもそもテレビあんま見ないし 1 チャンネルの (PX-S1UD) でも良かったかも.
NTTCom SCR3310
B-CAS カードの読み取りに使う. Raspberry Pi で動作してる IC カードリーダーは他にもあるし動けば何でもあり.
B-CAS カード
使ってないテレビから拝借.
HDD
ファイルの保存用. 30分アニメを H.264 の mp4 にエンコードして 1GB 前後なので, デカい容量の方がいい.
自分は取りあえず RT-AC68U の Samba で共有している HDD を使ったので準備してない.
使用したソフトウェア
- Mirakurun
- EPGStation
Raspberry Pi 本体のセットアップ
デスクトップ用途では使わないので, ヘッドレスの Raspbian をインストールした. 別記事に書いた内容をほぼそのまま実行.
チューナーの準備
今回は PLEX PX-Q1UD を使っているので, PLEX のサイトからドライバをダウンロードして Raspberry Pi の /lib/firmware/
に入れる.
PX-Q1UD の中身は, 1 チャンネルモデルの PX-S1UD が USB ハブで 4 つ繋がってるのと同じ感じなので PX-S1UD のドライバをそのまま使う.
$ 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
を実行すると PX-S1UD Digital TV Tuner
が 4 つ見えるはず.
$ dmesg | grep PX-S1UD
カードリーダーの準備
ビルドツールや諸々をインストールする.
$ sudo apt install build-essential pcscd libpcsclite-dev libccid pcsc-tools
B-CAS カードを読み取れているかを確認する.
$ sudo pcsc_scan
Japanese Chijou Digital B-CAS Card (pay TV)
みたいなのが出てれば OK.
B-CAS デコード用のライブラリをインストール
stz2012/libarib25 をインストールする.
$ sudo apt install cmake g++
$ git clone https://github.com/stz2012/libarib25
$ cd libarib25
$ cmake .
$ make
$ sudo make install
録画用コマンドをインストール
recdvb を使うのでインストール.
$ sudo apt install 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 20 10 test.m2ts
みたいなのを実行すれば録画できてるはず. (物理チャンネル 20
を 10 秒間録画して test.m2ts
に保存.)
Node.js をインストール
Mirakurun と EPGStation が動作するバージョンの Node.js をインストールする. Node.js をインストールする方法は無限にあるけど動けばなんでもいい.
Mirakurun をインストール
Dockerを使ってインストールする方法と直接インストールする方法がある.
自分は最初に作ったときは直接インストールしたけど,後からDockerに移行した. Dockerの使い方さえ分かればDockerでやる方が簡単だと思うのでおすすめ.
Docker を使ってインストール
別の記事に書いたのを参照
直接インストール
Mirakurun のドキュメント に従ってインストールする.
プロセスマネージャーに pm2 を使うのでインストールする必要がある.
$ sudo npm install pm2 -g $ sudo npm install mirakurun -g --unsafe --production
チューナーの設定.
sudo mirakurun config tuners
を実行すると /usr/local/etc/mirakurun/tuners.yml
が開かれるので設定する.
$ sudo mirakurun config tuners
で YAML をこんな感じに. PX-Q1UD は PX-S1UD が 4 つあるのと同じ感じなので, 4 個書く.
- name: PX-Q1UD-1_1 types: - GR command: recdvb --b25 --strip --dev 0 <channel> - - - name: PX-Q1UD-1_2 types: - GR command: recdvb --b25 --strip --dev 1 <channel> - - - name: PX-Q1UD-1_3 types: - GR command: recdvb --b25 --strip --dev 2 <channel> - - - name: PX-Q1UD-1_4 types: - GR command: recdvb --b25 --strip --dev 3 <channel> - -
sudo mirakurun restart
で一回再起動する.
次に channels.yml
を設定.
これは API を使うと自動スキャンでよしなにしてくれるので curl で API 叩いて待つ.
$ curl -X PUT "http://localhost:40772/api/config/channels/scan"
終わったら sudo mirakurun restart
で再起動する.
EPGStation をインストール
EPGStation のセットアップマニュアル に従ってインストールする.
EPGStation のドキュメント, 親切に書いてあるのでちゃんと読んで実行すればいい感じになる.
FFmpeg をインストール. Raspberry Pi にはビデオ入力用に H.264 のハードウェアエンコーダがあるのでそれを有効化した FFmpeg を使いたいんですけど, 今は手動ビルドしなくても apt から入る FFmpeg で既に有効化されているので, 普通にインストールした.
インストールして ffmpeg -encoders | grep h264
を実行すると h264_omx
が見えるはず
$ sudo apt install ffmpeg
EPGStation をインストールして, 設定ファイルをコピーする.
$ git clone https://github.com/l3tnun/EPGStation.git
$ cd EPGStation
$ npm install
$ npm run build
$ cp config/config.sample.json config/config.json
$ cp config/operatorLogConfig.sample.json config/operatorLogConfig.json
$ cp config/serviceLogConfig.sample.json config/serviceLogConfig.json
config.json
を書き換える.
設定の内容は全部 https://github.com/l3tnun/EPGStation/blob/master/doc/conf-manual.md に書いてある.
ffmpeg
とffprobe
の場所を指定するwhich ffmpeg
で場所を調べてconfig.json
のffmpeg
とffprobe
を書き換える
- 録画関連のファイルの保存先を Samba に向けておく
- 初期設定では microSD に保存される
recorded
,recordedTmp
,uploadTempDir
, など
- データベースに SQLite3 を使う場合,
regexp.so
をビルドする.
Samba をマウントする
今回は録画したファイルを Samba に保存するので, 適当な所にマウントする.
起動時にマウントして欲しいので, /etc/fstab
に書き込む.
//192.168.1.1/TV-Rec /mnt/TV-Rec cifs username=username,password=password,rw,vers=2.0,file_mode=0755,dir_mode=0755,iocharset=utf8,defaults 0 0
sudo mount -a
を実行すると /mnt/TV-Rec
にマウントされる.
また, 起動時にネットワーク周りの設定を待つため, sudo raspi-config
を実行して, 3 Boot Options
-> B2 Wait for Network at Boot
を実行して再起動.
EPGStation を起動する
下のコマンドで EPGStation を起動して, http://192.168.1.xxx:8888
(Raspberry Pi の IP アドレス) にアクセスする.
$ pm2 start dist/server/index.js --name "epgstation" $ pm2 save
これで基本的な設定は終わり. 後は FFmpeg のオプションなどを調整しないと厳しい.
所感など
FFmpeg 関連はまだ研究中だけど, 少しオプションを調整して 30 分アニメのエンコードを実行したら 40~45 分で終了. まだ改善の余地ありかもしれないけど, 深夜アニメを録画して朝以降に見るくらいにしか使ってないので, 一旦これで運用中.
他に Raspberry Pi で録画鯖を作ろうとしてる人のために Webmin のダッシュボードのスクショを貼っておく. 構成は上の方に書いた使用したハードウェア, ソフトウェアの通り.
家の中でしか使ってないのでリアルタイム視聴は M2TS 無変換で流してる. ほぼ負荷なしで詰まることなく流せるので, 家の中に限ってはオススメ.
Raspberry Pi 4, 録画するだけなら余裕だし, エンコードも H.264 のハードウェアエンコーダを使えば結構行ける.
省電力での動作, ギガビットイーサネット対応, USB 3.0 対応, ハードウェアエンコーダ搭載というスペック, Raspberry Pi Foundation からの「録画鯖に使ってくれ」という熱いメッセージを感じる.
新規購入した Raspberry Pi をセットアップする
Raspberry Pi 3 Model B 以来 3~4 年振りのラズパイを新規購入. 録画鯖用に Raspberry Pi 4 Model B 4GB を買った.
もう一台別用途で買うかもしれないのでやったことを書いておく.
用意するもの
Raspberry Pi 本体
メモリが 1GB / 2GB / 4GB から選べる.
困ったらとりあえず 4GB を買っておけば間違いない.
電源 (5V/3A 推奨)
Raspberry Pi 4 なので電源は USB Type-C. 推奨は 5V/3A 出力だけど, USB 周り使わないなら 2.4A とかでも動くらしい.
5V/3A のアダプタなんて中々ないしなーと思ってたけど, 秋月とかスイッチサイエンスに売ってたのでこれを使った.
microSDHC
最低限 16GB は欲しい. 32GB あれば余裕.
microSDXC を買うとフォーマットが面倒なので普通に microSDHC を買ったほうがいい.
ケース (必要なら)
今回は常時起動で使うのでファンとかヒートシンクもついてるこれを買った. 普通に良いデザインなのでサーバーにしておくのが惜しい.
これに付属してるファンに限らず, GPIO で動くファンは shutdown
コマンドで電源落としても USB Type-C の電源抜かないと回り続けるので, 気になる人はスイッチで完全に電源を切れるアダプタ付きのを買ったほうがいい気がする.
LAN ケーブル (必要なら)
有線で作業する場合のみ必要. 自分はルーターから生えてるケーブルをそのまま使った.
後で書くけど wpa_supplicant.conf
を最初に作れば無線 LAN だけでセットアップ完結出来るし別になくてもいい.
Raspbian を microSD に焼く
Raspbian をダウンロードして microSD に焼く.
デスクトップ用途では使わないので Raspbian Lite をダウンロードした.
https://www.raspberrypi.org/downloads/raspbian/www.raspberrypi.org
本家からダウンロードすると時間掛かりすぎて一生終わらないので, JAIST のミラーからダウンロード するといい.
ダウンロードした zip ファイルを展開して img ファイルを microSD に書き込む.
自分は macOS を使ってるので dd
コマンドを使って書き込んだ.
# diskutil list を使って microSD の場所を調べておく $ diskutil list # フォーマットする $ diskutil eraseDisk MS-DOS rpi /dev/disk2 $ diskutil umount /dev/disk2 $ sudo dd bs=1m if=2020-02-13-raspbian-buster-lite.img of=/dev/rdisk2
書き込み終わったら microSD の /boot
に ssh
という名前の空ファイルを作っておく. (/boot/ssh
があると SSH がオンになる.)
無線 LAN を使う場合は /boot
に wpa_supplicant.conf
ファイルを作っておくと, 起動時に Wi-Fi に繋がる.
country=JP ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 network={ ssid="ルーターの SSID" psk="ルーターのパスワード" }
ラズパイに SSH で接続する
ルーターの管理画面なり何なりでローカルの IP アドレス調べて SSH で接続する.
初期のユーザー / パスワードは pi
/ raspberry
.
$ ssh pi@192.168.0.xxx
raspi-config を使って初期設定する
raspi-config
コマンドを使って
などをする
$ sudo raspi-config
終わると再起動する必要があるので再起動して再度ログインする.
apt のミラーを設定する
初期設定の raspbian.raspberrypi.org
でもミラーに転送してくれるけど, 最初から日本のサーバーに設定しておく.
/etc/apt/sources.list
を編集する.
# 初期のはコメントアウトしておく #deb http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi # JAIST あたりを追加する deb http://ftp.jaist.ac.jp/raspbian/ buster main contrib non-free rpi
IP アドレスを固定しておく
/etc/dhcpcd.conf
に IP アドレスを書き込むか, ルーター側で IP アドレスを固定するかのどっちか.
dhcpcd.conf
に書く場合は以下のような感じに
# 有線 interface eth0 static ip_address=192.168.1.xxx/24 static routers=192.168.1.1 static domain_name_servers=192.168.1.1 8.8.8.8 # 無線 interface wlan0 static ip_address=192.168.1.xxx/24 static routers=192.168.1.1 static domain_name_servers=192.168.1.1 8.8.8.8
ユーザー名を pi から変更する
サーバー用途で pi
/ raspberry
のまま使うのは本当に最悪なので, ユーザー名とパスワードを変更する.
アカウント削除で説明してる記事もあるけど, 既に pi ユーザーで作ったファイルがあったら面倒なので変更がいいと思う.
pi ユーザーでログインしたままユーザー名を変えるのは不可能なので, 一旦作業用ユーザーを作って実行する.
$ sudo useradd -M tmp $ sudo gpasswd -a tmp sudo $ sudo passwd tmp
一旦ログアウトして tmp
でログインする.
$ sudo usermod -l newuser pi $ sudo usermod -d /home/newuser -m newuser $ sudo groupmod -n newuser pi
ログアウトして newuser
でログインし直し, 作業用ユーザーを削除する.
$ sudo userdel tmp
newuser
のパスワードを変える.
$ sudo passwd newuser
鍵を設定する
SSH のログインで毎回パスワードを打つのは大変なので, 公開鍵認証でログイン出来るようにする.
ホスト側で ssh-keygen
を実行して鍵を作る.
$ ssh-keygen -t ed25519
$ mkdir ~/.ssh $ touch ~/.ssh/authorized_keys $ chmod 700 ~/.ssh $ chmod 600 ~/.ssh/authorized_keys
ホストの id_ed25519.pub
をラズパイの ~/.ssh/authorized_keys
に追加する.
ssh-copy-id
を使うと楽にコピーできていい.
$ ssh-copy-id -i ~/.ssh/id_ed25519.pub ${user_name}@192.168.0.xxx
ホスト側の ~/.ssh/config
を設定しておく
Host raspi4 Hostname 192.168.1.xxx Port 22 User ユーザー名 IdentityFile ~/.ssh/raspi/id_ed25519
ここで一旦, 公開鍵認証でログイン出来るか試しておく. 設定出来てないままパスワードログインを無効化すると完全に終わるので一回試す.
sshd の設定
ラズパイ側の /etc/ssh/sshd_config
を編集する
- root でのログインを無効化
PermitRootLogin no
- 空パスワードの無効化
PermitEmptyPasswords no
- パスワード認証の無効化
PasswordAuthentication no
- ポートの変更
Port 任意のポート番号
終わったら sudo systemctl restart sshd
で sshd を再起動.
一旦 SSH を切断して新しい設定でログイン.
スワップの無効化
デフォルトでは 100MB ほどスワップ領域が確保されるけど, あってもまず使うことないし, 使っても遅いしでメリットないので切っておく.
$ sudo swapoff --all $ sudo systemctl stop dphys-swapfile $ sudo systemctl disable dphys-swapfile
/tmp
と /var/tmp
を tmpfs にする
/tmp
とかでデカい容量使わないなら実行しておくといい.
/etc/fstab
を編集して, /tmp
と /var/tmp
を tmpfs にする.
$ sudo vim /etc/fstab
tmpfs /tmp tmpfs defaults,size=32m,noatime,mode=1777 0 0 tmpfs /var/tmp tmpfs defaults,size=16m,noatime,mode=1777 0 0
終わったら再起動しておく.
これで基本的なセットアップは終わり.