Hiroto's diary

プログラミングとか色々

Raspberry Pi 4 で録画サーバーを作った (Mirakurun + EPGStation)

ブログは移動したので,最新のを見る場合は下記のリンクを参照。

scrapbox.io


Raspberry Pi 4 で録画サーバーを作った.

f:id:Hiroto-K:20200303210122j:plain
録画サーバー周りの様子, 超コンパクト

使用したハードウェア

Raspberry Pi 4 Model B 4GB

メモリの使用量的には 2GB モデルでも平気だと思うけど, とりあえず 4GB なら間違いない. 2GB モデルの値段が安くなったけども, メモリが余る分には困らないし, 4GB がおすすめ.

www.switch-science.com

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

github.com

github.com

Raspberry Pi 本体のセットアップ

デスクトップ用途では使わないので, ヘッドレスの Raspbian をインストールした. 別記事に書いた内容をほぼそのまま実行.

hiroto-k.hatenablog.com

チューナーの準備

今回は 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 をインストールする.

github.com

$ 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 を使ってインストール

別の記事に書いたのを参照

hiroto-k.hatenablog.com

直接インストール

Mirakurun のドキュメント に従ってインストールする.

github.com

プロセスマネージャーに 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 を使うと自動スキャンでよしなにしてくれるので curlAPI 叩いて待つ.

$ curl -X PUT "http://localhost:40772/api/config/channels/scan"

終わったら sudo mirakurun restart で再起動する.

EPGStation をインストール

EPGStation のセットアップマニュアル に従ってインストールする.

EPGStation のドキュメント, 親切に書いてあるのでちゃんと読んで実行すればいい感じになる.

github.com

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 に書いてある.

github.com

  • ffmpegffprobe の場所を指定する
    • which ffmpeg で場所を調べて config.jsonffmpegffprobe を書き換える
  • 録画関連のファイルの保存先を 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 のダッシュボードのスクショを貼っておく. 構成は上の方に書いた使用したハードウェア, ソフトウェアの通り.

f:id:Hiroto-K:20200305234704p:plain
EPGStation で 1 番組録画 + VLC で M2TS 無変換のストリーム 2 個 を実行してる時のダッシュボード

f:id:Hiroto-K:20200306000752p:plain
30 分アニメを 1 本エンコード (ハードウェアエンコーダ使用) + VLC で M2TS 無変換のストリームを 2 個 を実行してる時のダッシュボード

家の中でしか使ってないのでリアルタイム視聴は 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 を買っておけば間違いない.

www.switch-science.com

www.switch-science.com

電源 (5V/3A 推奨)

Raspberry Pi 4 なので電源は USB Type-C. 推奨は 5V/3A 出力だけど, USB 周り使わないなら 2.4A とかでも動くらしい.

5V/3A のアダプタなんて中々ないしなーと思ってたけど, 秋月とかスイッチサイエンスに売ってたのでこれを使った.

akizukidenshi.com

www.switch-science.com

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 のミラーからダウンロード するといい.

ftp.jaist.ac.jp

ダウンロードした 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/bootssh という名前の空ファイルを作っておく. (/boot/ssh があると SSH がオンになる.)

無線 LAN を使う場合は /bootwpa_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

ラズパイに SSH の設定ディレクトリとファイルを作る.

$ 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 sshdsshd を再起動. 一旦 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

終わったら再起動しておく.


これで基本的なセットアップは終わり.

© 2015 hiroxto