Raspberry Pi 4で地デジ録画サーバー
はじめに
著作権にだけは気を付けてください。
使用機器
Raspberry pi 4 ModelB 4GB
秋葉原で7000円弱ぐらい。3でも普通に動くらしい(未検証)。
PLEX USB接続型フルセグ対応地上デジタルTVチューナー PX-Q1UD
秋葉原で15000円ぐらい。同時録画しない人はPX-S1UD V2.0でも問題ない。
SEAGATE BarraCudaハードディスク・ドライブ6TB ST6000DM003
秋葉原でセールで9800円。好みで何でもいい。.m2tsの形式で保存するなら1時間のバラエティを録画すれば大体6~7GBになる。
玄人志向 SSD/HDDスタンド KURO-DACHI/ONE
amazonで2500円。今回は6TBのHDDを利用したので別電源が必要になる。容量の小さなHDDを使う場合でも、多くの危機をUSBで接続するためセルフパワーを供給できる機器はあったほうがよい。
SCM ICカードリーダー/ライター B-CAS・住基カード対応 SCR3310/v2.0
amazonで2000円。B-CASが読み取れれば何でもよい(未検証)。
PB-MC03:mini B-CAS 変換アダプター 《mini B-CAS to B-CAS LONG CARD》
amazonで600円強。mini B-CASを廃止しろ(過激派)。どうでもいいけどmini B-CAS to B-CASはほとんど見ない。逆は多いが。
F-FACTORY アンテナケーブル 1m (スリム・極細)
amazonで400円。アンテナケーブルにはF型とかL型とかいろいろあるが今回使ったPX-Q1UDはF型ネジ式。まあ無理やり刺しても動くことは動く。保証はしない。
HDDのマウント
ラズパイの初期設定は終わっているものする。
HDDの確認
ラズパイにはGPartedというGUIアプリケーションを利用してもよい。(画像は設定後の物)

ターミナルでも以下のコマンドで確認できる。
$ sudo fdisk -l | grep /dev/sd
Disk /dev/sda: 5.5 TiB, 6001175126016 bytes, 11721045168 sectors
今回の増設ディスクは/dev/sda
HDDのフォーマット
fdiskは2TB以上のHDDの対応していないのでpartedを使う。
$ parted /dev/sda
GNU Parted 3.2
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel gpt
Warning: The existing disk label on /dev/sda will be destroyed and all data on
this disk will be lost. Do you want to continue?
Yes/No? y
(parted) mkpart primary ext4 0% 100%
これで/dev/sdaというディスクにパーティションを作成できた。これが終わったら、
(parted) quit
通知: 必要であれば /etc/fstab を更新するのを忘れないようにしてください。
で終了。次に
$ mkfs.ext4 /dev/sda1
でフォーマットする。
fstabの更新
再起動した際にマウントする位置をfstabで指定しておかないと手動でマウントすることになるので、fstabを更新する。
HDDのUUIDを調べる。
$ sudo blkid /dev/sda1
/dev/sda1: UUID="1ff412de-12f6-4d09-aa67-e413313d893a" TYPE="ext4" PARTLABEL="primary" PARTUUID="edd64c2b-23b7-4376-994e-f6c61045e9ff"
HDDが/mnt/hdd1の自動マウントされるようにfstabを更新
# 設定ファイルのバックアップ
sudo cp /etc/fstab /etc/fstab.bak
# fstabの編集
sudo nano /etc/fstab
# 最終行に以下のように設定を追加
UUID=1ff412de-12f6-4d09-aa67-e413313d893a /mnt/hdd1 ext4 nofail 0 0
設定が終わったら再起動してGPartedなりなんなりで/mnt/hdd1にマウントされているか確認する。
ユーザーの追加
ラズパイのデフォルトユーザはセキュリティに問題があるのと、後述のChunachuはデフォルトユーザーでは動かないようなのでユーザーを追加する(筆者が3日悩んだ理由)。以降の操作はこの追加ユーザの方で行うとよい。
$ sudo adduser <追加ユーザ>
$ sudo gpasswd -a <追加ユーザ> sudo
# Chinachuを使うためにはユーザーをvideoグループに追加する必要がある。
$ sudo adduser <追加ユーザ> video
# ディレクトリの権限変更
$ sudo chown <追加ユーザ>:video /mnt/hdd1
Sambaのインストール
HDDを直接接続していない端末から見れるようにSambaを利用する。
$ sudo apt-get install samba
$ sudo nano /etc/samba/smb.conf
# 以下の設定を追加
[raspberrypi]
comment = Raspberry Pi
path = /mnt/hdd1
guest ok = yes
read only = no
browsable = no
force user = <追加ユーザ>
# sambaを再起動
$ sudo service smbd restart
# ディレクトリのオーナーを変更
$ sudo chown <追加ユーザ>:video /mnt/hdd1
windows10ならエクスプローラを開いて
\\<ラズパイのipアドレス>\raspberrypi\
を入力してやればHDDを覗けるようになっているはず。
チューナのドライバのインストール
$ 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/
B-CASリーダの設定
# ドライバのインストール
$ sudo apt-get install build-essential git
$ sudo apt-get install pcscd libpcsclite-dev libccid pcsc-tools
割と認識しない現象が頻発するので、その場合には再起動や差し直しをする。
# B-CASが読み取れるか動作確認
$ sudo pcsc_scan
0: SCM Microsystems Inc. SCR 3310 [CCID Interface] (XXXXXXXXXXXXX) 00 00
...中略...
Japanese Chijou Digital B-CAS Card (pay TV)
#Ctrl+Cで終了
最後のJapanese Chijou Digital B-CAS Card (pay TV)が表示されていれば問題ない。
Scanning present readers...で止まってしまう場合には起動ファイルを修正する。詳細はレコーダーに B-CAS カード認識させたに。
B-CASデコード用ライブラリのインストール
$ sudo apt-get install cmake g++
$ wget https://github.com/stz2012/libarib25/archive/master.zip -O libarib25.zip
$ unzip libarib25.zip
$ rm libarib25.zip
$ cd libarib25-master
$ cmake .
$ make
$ sudo make install
recdvbのインストール
コマンドラインから録画を行うツールであるrecdvbをインストールする。
$ 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
#字幕やデータ放送のデータが不要な場合は
$ make
#字幕やデータ放送のデータが必要な場合は
$ EXTRA_SID=1 make
$ sudo make install
問題がなければ
# $ sudo recdvb [--dev <チューナ番号>] --b25 --strip チャンネル番号 録画秒数 録画ファイル名
$ recdvb --b25 --strip 22 10 /mnt/hdd1/test.m2ts
ですでに録画ができるようになっているはず。チャンネル番号はマスプロのチャンネルリストで確認できる。
うまく動作しなかったりcannot open frontend deviceと表示されたりする場合には再起動や差し直しを試してみるとよい。
また、PX-Q1UDは伝播強度の強い環境で安定せず、信号が飽和してしまう問題があるので、録画が実行できるものの映像が乱れるといった場合にはアンテナケーブルを半刺しにしたり、減衰器を使ってやるとよい。
Mirakurunのインストール
チューナサーバであるMirakurunを導入するとチューナをLANないから管理できるようになる。
MirakurunはNode.js上で動作するサーバーであるためNode.jsをインストールしてからMirakurunをインストールする。バージョン指定はChinachu v0.10.1 -gamma.0がv10.16.3を要するためである。
$ sudo apt-get install npm
$ sudo npm install -g n
$ sudo n 10.16.3
$ sudo npm install -g npm
#Mirakurunのインストール
$ sudo npm install pm2 -g
$ sudo npm install mirakurun -g --unsafe --production
次にチューナの設定を行う。
$ sudo EDITOR=nano mirakurun config tuners
#PX-Q1UD は 4チューナーあるので4つ設定。
#nameは自由に設定してよい。typesはGRは地上波、BSはBS、CSはCS、SKYはスカパーに対応する
#PX-S1UD V2.0 の場合は 1チューナーなので --dev x オプションを外した一つだけでよい
- 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> - -
以下のコマンドでMirakurunのchannels scan APIを使ってチャンネルのリストを自動更新できる。時間はかかるが手動でやるよりマシ。
$ curl -X PUT "http://localhost:40772/api/config/channels/scan"
Chinachuのインストール
Mirakurunで提供されたAPIを利用する録画サーバーのChiinachuをインストールする。これ得お導入すると番組表が見れたりブラウザから録画予約ができる。
$ sudo apt-get install build-essential curl git-core vainfo
#Chinachuは容量が大きいためHDDにインストールする。
$ git clone git://github.com/kanreisa/Chinachu.git /mnt/hdd1/chinachu
$ cd /mnt/hdd1/chinachu
$ ./chinachu installer
> 1. Auto を選択
#大量のWARMが出るがERROR出なければ問題ない
#録画ルールの初期ファイルを作成
$ echo "[]" > rules.json
# 録画設定ファイルの作成
$ cp config.sample.json config.json
# uid, recordedDir, temporaryDir, recordedFormat 辺りを編集。
$ nano config.json
"uid": "<追加ユーザ>"
"recordedDir" : "/mnt/hdd1/recorded/",
"temporaryDir" : "/mnt/hdd1/recordtmp/",
"recordedFormat": "[<date:yymmdd-HHMM>]<title> <subtitle> <episode:2>.m2ts",
.nave/installed/ 以下が空の場合はNode.jsのバイナリに向けてシンボリックリンクを作成しておく必要がある。
# node のシンボリックリンク先を確認
$ cd .nave
$ ls -la
> node -> /mnt/hdd1/chinachu/.nave/installed/10.16.3/bin/node
> npm -> /mnt/hdd1/chinachu/.nave/installed/10.16.3/bin/npm
# n でインストールした上記と一致するバージョンのnodeへのシンボリックリンクを作成
$ cd installed/
$ ln -s /usr/local/n/versions/node/10.16.3 10.16.3
ここまで出来たらChinachuの動作確認をする。
$ cd /mnt/hdd1/chinachu/
$ ./chinachu service wui execute
#Ctrl+Cで停止
追加ユーザの方で作業をしていないとここでnode modulesが存在しないというエラーが出る。筆者はそれでGitのIssueを全部読むという地獄に陥った。
正常に動作していれば http://[ラズパイIPアドレス]:20772/ を適当なブラウザで開いてやればChinachuにアクセスできる。

あとはこの画面から録画予約などが行える。ルールを作成してやれば毎週自動予約もできる。
終わりに
ffmpegとcronを使って自動エンコードなんかもできるが、映像が乱れたりしがちなので私はしていない。ただ再生するときに重たかったりはするのでその辺は好き好き。
4万円で4番組同時録画容量6TBかつデータが取り出せるレコーダーが組めたのでかなりお得だった(ビックカメラの通販で一番売れてるのが2TB3番組同時録画で3万ちょいとかだったので)。
参考文献
- Raspberry Pi 4+Chinachu v0.10.1-gamma.0 地デジ録画サーバー構築
https://qiita.com/tomtwinkle/items/99fe34140fa5b1a70e7b - USB接続で地デジ4チャンネル録画できるチューナーPX-Q1UDを買ったそして試した
https://diary.hatenablog.jp/entry/2018/03/15/215147 - レコーダーに B-CAS カード認識させた
http://drillbits.hatenablog.com/entry/nejireco_bcas