Raspberry Piを買ったものの何ができるのか。そんな方もいるかと思いますが、Raspbery PiはいうなればLinuxのパソコンなのでLinuxでできることならほとんどできます。これに目を付けて録画サーバーに切るんじゃないかと思ったらやはりできるようです。今回は私が躓いた点などを説明しながら録画サーバーを構築していきます。
今回はEPGStationとPX-W3PE4を使うという前提で解説を行います。PX-W3PE4でなくとも構成が全く同じPX-W3U4であれば同じ方法で問題なく利用可能です。join_logo_scp導入に関して別ページで紹介しています。自動化も併せてどうぞ。HWエンコード時の負荷や、join_logo_scpについては補足の項目で扱っています。
目次
環境
- Raspberry Pi 4 B 4GB
- PX-W3PE4またはPX-W3U4
- PX-W3PE4の場合は別途ライザーカードなどで電源供給要
- カードリーダ(BCAS用)(SoftCasの場合は不要)
- HDDなどの録画用ストレージ
- LANに接続していること
- OSはRaspbain (Raspberry Pi OS)をmicroSDカードに
また録画予約の管理にはEPGStationを用います。
(追記:2021/7/21)今回の記事はあくまでPX-W3PE4やPX-W3U4向けです。以下のような製品なら大丈夫です。
しかし、最近発売されたPX-W3PE5はUSBケーブルでのデータ転送ではなく、USB to PCIEx チップを介した完全なPCIEx接続のため今回のようなRaspberry Pi環境では使えません。
言い換えればPCIExスロットを持つ普通のデスクトップPCなどでは今回紹介するような方法で使用できます。配線も少ないので本来ならそちらの方が楽ですね。RaspberryPiに変態構成のPCIExカードを接続しようとする方が変わっていますからね(笑)。
(追記:2021/8/28)
今回の環境のようにPX-W3PE4などPCIEx接続(内部でUSB接続)タイプの外付け化の詳しい記事を書きました。気になる方はどうぞ。今回のセットアップと少しだけ変えなければならない部分もありますが、PX-MLT5PE/MLT8PEなどでも同じ方法でRaspberry Piを用いて録画ができるようになります。
セットアップ
ここから必要なセットアップを行っていきます。Raspberry Piの基本の初期設定などは特に細かく説明しないで少しだけ飛ばしていきます。
必要なパッケージなどのインストール
以下のコマンドを実行します。
$ sudo apt-get update
$ sudo apt-get install cmake automake autoconf exfat-utils pcscd libpcsclite1 libpcsclite-dev libccid pcsc-tools samba sqlite3 ffmpeg
$ sudo apt-get install build-essential curl git-core libssl-dev yasm libtool autoconf python git raspberrypi-kernel-headers
$ sudo raspi-config
ここのraspi-configで言語を日本語、タイムゾーンを東京(Tokyo)に設定します。
一応私はフォルダを共有するのにsambaを使たのでsambaをインストールしています。
録画するためのフォルダを作成する
HDDを利用する場合はHDDの初期フォーマットを行う必要があります。著しくmicroSDの寿命が縮むのでおすすめはしませんが、本体に保存する場合はディレクトリを作成するだけで大丈夫です。HDDのフォーマットは以下の手順で行います。
HDDをつなげたら以下のコマンド実行してどのように認識されているかを確認します。
$ fdisk -l
...
Disk /dev/mmcblk0: 7.4 GiB, 7948206080 bytes, 15523840 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x6c586e13
どこかにHDDがあると思うので探します。大体は容量で予想できると思います。Disk の後ろの /dev/mmcblk0に該当する部分をコピーしておきます。今回は本体のmicroSDのやつになっていますが、ほとんどの場合は/dev/sdaか/dev/sdbあたりだと思います。
さてコピーしたら以下のコマンドを実行してフォーマットをします。
mkfs -T ext4 (コピーしたやつ)
例えば/dev/sdaなら以下のようにしてください。
mkfs -T ext4 /dev/sda
これでいくつか聞かれると思うのでEnterで決定してください。
次にマウントするディレクトリを作成します。好きなところに作ってもらえばいいのですが今回はサンプルとして/mnt/hddにマウントするということにしてそのディレクトリを作成します。
sudo mkdir /mnt/hdd
次にHDDをマウントするために記述を行わなければならないのでそれを設定します。
sudo nano /etc/fstab
一番下に以下のような追記をしてください。
/dev/sda /mnt/hdd ext4 defaults,nofail 0 0
先頭の部分はご自身の環境に合わせて下さい。さっきコピーしたやつです。
ちなみにUUIDというもので設定することもできるのですが、Raspberry PIの場合はUSBストレージを複数ぶら下げなければ使わないので今回は説明しません。必要であれば別途調べてください。
あとは一度再起動を行います。
sudo reboot
再起動後、以下のコマンドを入力したらこの項目は終了です。
sudo chmod -R 777 /mnt/hdd
最後のディレクトリはご自身の環境にあわせてください。サンプルでは保存先を/mnt/hddにするためこの設定です。
sambaを設定
録画ファイルを外部から見れるようにsambaの設定を行います。設定ファイルを編集します。
sudo nano /etc/samba/smb.conf
すると色々書かれたファイルが出てくると思いますが、一番下に以下のような形で追記します。
[Pi]
comment = Raspberry Pi
path = /mnt/hdd
guest ok = yes
read only = no
browsable = yes
path以降はHDDをマウントしたディレクトリ(共有したいフォルダ)を選択してください。これを保存した後、sambaのサービスを再起動してもいいのですが、今回は念のため本体を再起動させます。
sudo reboot
次に共有フォルダができているか確認します。確認の前にRaspberry PiのIPを調べておいてください。調べ方は以下のコマンドを実行することでで可能です。
ifconfig
LANケーブルでつないでるならeth0、Wi-Fiならwlan0あたりのIPをを覚えておいてください。
さて確認の方法ですが、Windowsの場合で説明します。エクスプローラを開いて、パスを入力する場所にRaspberry PiのIPアドレスを以下のような形で入力します。例えばRaspberry PiのIPアドレスが「192.168.1.xx」ならこんな感じです。
\\192.168.1.xx
すると先ほど設定したフォルダが設定通りなら「Pi」として見えていれば大丈夫です。Piのフォルダに入ってフォルダを新規作成してみたりしましょう。これで作成、削除ができれば正しく共有フォルダを設定できています。
px4_drvのインストール
以下のコマンドを実行します。
$ git clone https://github.com/nns779/px4_drv
$ cd px4_drv/fwtool/
$ make
$ curl -O http://plex-net.co.jp/plex/pxw3u4/pxw3u4_BDA_ver1x64.zip
$ unzip -oj pxw3u4_BDA_ver1x64.zip pxw3u4_BDA_ver1x64/PXW3U4.sys
$ ./fwtool PXW3U4.sys it930x-firmware.bin
$ sudo mkdir -p /lib/firmware
$ sudo cp it930x-firmware.bin /lib/firmware/
$ cd ../
$ sudo //apt-get -y install raspberrypi-kernel-headers
$ cd driver
$ make
$ sudo make install
$ sudo modprobe px4_drv
これを淡々と入力するだけで終わりです。
B-CAS関係
カードリーダを使う場合
以下のコマンドで確認するだけです。
$ pcsc_scan | grep B-CAS
これを実行したら以下の表示があれば大丈夫です。
Japanese Chijou Digital B-CAS Card
SoftCasを使う場合
これは詳しいことはいいませんが、以下のコマンドLinuxで使うための説明の一部になっていますのご自身で設定してください。
$ wget -O winscard.cpp http://pastebin.com/raw/5144Ah9g
$ wget -O Makefile http://pastebin.com/raw/FQdSixkB
$ sed -i "/LONG SCardGetStatusChange/s/LPSCARD_READERSTATE_A/LPSCARD_READERSTATE/g" winscard.cpp
$ sed -i "s/SCARD_IO_REQUEST g_rgSCardT1Pci;/const SCARD_IO_REQUEST g_rgSCardT1Pci = { SCARD_PROTOCOL_T1, sizeof(SCARD_IO_REQUEST) };/g" winscard.cpp
ちなみにこれを利用するとWi-Fiが使えなくなります。なので基本的には有線接続がおすすめです。ライブラリのリンクを変えれば干渉することなく使えたりもするのですが、今回は説明をしません。
libarib25の導入
$ wget https://github.com/stz2012/libarib25/archive/master.zip
$ unzip master.zip
$ cd libarib25-master
$ cmake CMakeLists.txt
$ make
$ sudo make install
SoftCasだとこれをインストールした時点でWi-Fiが使えなくなります。それ以外にこれといって不具合はなかったはずです。
recpt1(stz版)の導入
$ git clone https://github.com/stz2012/recpt1.git
$ cd recpt1/recpt1
$ sed -i -e "/^char \*bsdev\[NUM_BSDEV\] = {$/a \ \ \ \ \"/dev/px4video1\",\n\ \ \ \ \"/dev/px4video0\"," pt1_dev.h && \
$ sed -i -e "/^char \*isdb_t_dev\[NUM_ISDB_T_DEV\] = {$/a \ \ \ \ \"/dev/px4video2\",\n\ \ \ \ \"/dev/px4video3\"," pt1_dev.h && \
$ ./configure --enable-b25
$ make
$ sudo make install
今回はrecpt1でデコードをするため --enable-b25オプションを付けています。
録画テストする場合は以下のコマンドを実行してみましょう。
recpt1 --b25 --strip 24 10 /mnt/hdd/test1.ts
もしNo signal的なことを言われたら24の部分を変えてみてください。地域によって番号が違うので試してみればどこか映るチャンネルがあるはずです。
Node と mirakurun の導入
$ sudo apt-get install -y nodejs
$ sudo npm install n -g
$ sudo n stable
$ sudo npm install pm2
$ sudo pm2 startup
$ sudo npm install mirakurun -g --unsafe --production
$ sudo npm install arib-b25-stream-test -g --unsafe
mirakurunの設定を書き換えます。
sudo nano /usr/local/etc/mirakurun/tuners.yml
以下のようにする必要がありますが、前にフォーマットが崩れてうまく録画できなかったことがあったので、コピペするのではなく違うところを順番に書き換えていくのがおすすめです。
- name: PX4-S1
types:
- BS
- CS
command: recpt1 --b25 --device /dev/px4video0 - -
decoder: arib-b25-stream-test
isDisabled: false
- name: PX4-S2
types:
- BS
- CS
command: recpt1 --b25 --device /dev/px4video1 - -
decoder: arib-b25-stream-test
isDisabled: false
- name: PX4-T1
types:
- GR
command: recpt1 --b25 --device /dev/px4video2 - -
decoder: arib-b25-stream-test
isDisabled: false
- name: PX4-T2
types:
- GR
command: recpt1 --b25 --device /dev/px4video3 - -
decoder: arib-b25-stream-test
isDisabled: false
チャンネルスキャンを以下のコマンドで行います。時間が15分くらいかかるので、ゆっくり待ちます。
$ curl -X PUT "http://localhost:40772/api/config/channels/scan"
BS/CSの分は更新があるとたまにかわっているのですが、私は以下のページの情報をコピペしてます。前はセットアップの時ここもいじらないと映らなかったのですがもしかしたら、今はそのままでも映るとかあるかもしれないので、以下のページで設定ファイルの中身を確認してみてください。
https://raw.githubusercontent.com/Chinachu/Mirakurun/master/config/channels.yml
channels.yamlの編集は以下でできます。
$ sudo nano /usr/local/etc/mirakurun/channels.yml
最後にキャッシュを増やします。
$ sudo nano /usr/local/etc/mirakurun/server.yml
以下の一文を追加してください。
highWaterMark: 268435456
さらに以下のファイルを追記か編集をします。
sudo nano /usr/lib/node_modules/mirakurun/processes.json
同じのがあれば編集、なければ追記してください。
"node_args" : "--max_old_space_size=1024"
これで編集完了です。
EPGStationの導入
以下のコマンドを入力します。
$ cd
$ 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
run buildの後は少し時間がかかるので気長に待ちます。それが終わったら残りのコマンドを実行して下さい。
今回はSQLiteを使うので正規表現を使えるようにしておきます。
$ wget https://www.sqlite.org/2019/sqlite-amalgamation-3290000.zip
$ wget https://www.sqlite.org/2019/sqlite-src-3290000.zip
$ unzip sqlite-amalgamation-3290000.zip
$ unzip sqlite-src-3290000.zip
$ cp sqlite-src-3290000/ext/misc/regexp.c sqlite-amalgamation-3290000
$ cd sqlite-amalgamation-3290000
$ gcc -g -fPIC -shared regexp.c -o regexp.so
$ sudo cp regexp.so EPGStation/data/
あとはconfig.jsonを設定します。
$ sudo nano config/config.json
オプションとか色々あるのでそれに関しては以下の作者様のページをご覧ください。
https://github.com/l3tnun/EPGStation/blob/master/doc/conf-manual.md
SQLiteだけわかりにくいと思うので紹介しておくと以下の一文を追記すれば大丈夫です。今回ホームディレクトリにインストールしているので、regxp.soはサンプルのような階層にしていますが、ご自身の環境に合わせて変更してください。
"sqlite3": {
"extensions": [
"/home/pi/EPGStation/data/regexp.so"
],
"regexp": true
},
config.jsonの設定が終わったら以下のコマンドを実行します。
$ pm2 start dist/server/index.js --name "epgstation"
$ pm2 save
これでブラウザで以下のRaapberryPiのIP:8888にアクセスします。例えばこんな感じのをブラウザに入れれば大丈夫です。
http://192.1582.10:8888
これで番組表などが映れば大丈夫です。早くセットアップが終わっていると、番組表の取得がまだだったりするので、真っ白だったりしてもあせらずゆっくり待ってみましょう。join_logo_scpを用いたエンコードについては補足の項で説明します。
補足
録画データをみるためにはどうするのかというところですが、いくつかの手段があるので好きなものを用いて下さい。ただし今回は説明しないつもりです。
- EPGStationからTSを垂れ流してみる
- miniDLNAでメディアサーバを立ててそれを経由する。
- sambaで録画フォルダを共有フォルダにして直接再生する。
キーワードは出しておいたので各自で気になるものがあれば調べてみて下さい。細かく説明するほどのものでもないです。
エンコードでjoin_logo_scpを用いる場合は、以下のページで紹介しています。
このページではjoin_logo_scpの導入について書かれていますが、自動化する場合などについてもリンク先から飛べるようにしています。
また、エンコード時のパフォーマンスが気になるという方は以下のページで録画しながらハードフェアエンコードをしたときのパフォーマンスも併せて掲載しています。
まとめ
ちなみにこれ自体1年前にセットアップした備忘録なので間違いなどがあることもありますので、ご指摘いただければ修正しますのでよろしくお願いします。
パフォーマンスを手軽に監視したい場合は良ければ以下のtmchkを使うと簡単にCPUパフォーマンスを計測できます。