【ラズパイ】Raspberry Pi 4でNASとテレビ録画サーバーを自作

Raspberry Pi

ラズパイでテレビチューナー自作

我が家は築40年ほどのボロ借家 (借りてるのに失礼)。猫飼っていると新しい賃貸に住めないので仕方ない話です。それはそれと、古いからか備え付けの地デジアンテナの感度が非常に悪いので室内据え置き型の地デジアンテナとBSCS/4Kアンテナを自分で設置しています。スカイツリーからの強電界エリアなので何とかなっていますが家の中でテレビを増やすのには都合が悪い。いっそのこと地デジと衛星放送をラズパイで処理させて家の中ではWiFiでリアルタイムで見れるようにするとします。テレビはリビングだけで十分、家の中どこでもパソコンやスマホで見れるようになります。

ラズパイ4にテレビチューナーとカードリーダーでリアルタイム配信とSMBで録画ファイルを家庭内LANで共有がゴールです。OpenMediaVaultでHDDをマウントと家庭内に共有し、Mirakurunでチャンネルやチューナーの制御、EPGStationで番組表などのインターフェイスと録画の制御を行う構成です。EPGStationのほかにChinachuというものもありますが誰でも初見で使えそうなEPGStationを採用しています。

Raspberry Pi OS Lite (32bit) のインストール

この後にインストールするOpenMediaVaultはラズパイではCUI (Lite版) が推奨なのでLiteの方をインストールします。起動速度も速いしテレビチューナーとNASの運用ならGUIはいらないので不便にはなりません。おなじみRaspberry Pi Imagerで指定するだけ。64bitではハードウェアエンコーダーをフルに活かしきれないようなので32bitで進めます。

起動ディスクはSDカード、録画先は外付けHDDでの運用です。PowerShell経由でssh接続します。下の記事のVNC接続の手前まで完了すればokです。

SSH接続ができたら以下のコマンドを実行しておきます。

//最初のおまじない
$ sudo apt update
$ sudo apt full-upgrade -y
//タイムゾーンの設定
$ sudo timedatectl set-timezone Asia/Tokyo
// 自分用、まとめて実行
$ sudo apt update && sudo apt full-upgrade -y && sudo timedatectl set-timezone Asia/Tokyo

OpenMediaVaultのインストール

ラズパイにNASの機能を持たせるためにOMVをインストールします。先に書いた通りGUI版だと不具合がでるのでLiteにしましたが、そのLiteでもOMVを普通にインストールすると無線LAN設定がリセットされてどうにもならなくなるのでネットワーク設定をスキップする方法で進めます。

【WiFi接続の場合】

$ wget https://github.com/OpenMediaVault-Plugin-Developers/installScript/raw/master/install
$ chmod +x install
$ sudo ./install -n
//自分用、まとめて実行
$ wget https://github.com/OpenMediaVault-Plugin-Developers/installScript/raw/master/install && chmod +x install && sudo ./install -n

 

【有線の場合】

これでうまくいくときもあるのですが、有線で接続してSSHでつないでいてもeth0が行方不明になることがあるので、我が家は有線でも↑のコマンドでインストールしました。

$ sudo wget -O - https://github.com/OpenMediaVault-Plugin-Developers/installScript/raw/master/install | sudo bash

OMVのインストールはちょっと時間がかかります。終わったら外付けHDDを接続して、他のパソコンより“http://ラズパイのIPアドレス/”でOMVにアクセスします。

  • ユーザー名:admin
  • パスワード:openmediavault

ブラウザより設定を進めていきます。

  1. サービス ⇒ SMB/CIFS ⇒ 設定 ⇒ 有効 ⇒ 保存 ⇒ 適用
  2. ストレージ ⇒ ディスク ⇒ 外付けHDDがあることの確認
  3. ストレージ ⇒ ファイルシステム ⇒ +より外付けHDDをマウント ⇒ 適用
  4. ストレージ ⇒ 共有フォルダ ⇒ +より共有フォルダ作成 ⇒ パーミッションは「みんな:読み/書き」⇒ 保存 ⇒ 適用
  5. サービス ⇒ SMB/CIFS ⇒ 共有 ⇒ 有効 ⇒ フォルダ指定とゲストに許可 ⇒ 保存 ⇒ 適用

共有フォルダの名前は我が家ではtv/にしました。もし3で目当てのHDDがマウントできない場合は一度ストレージ ⇒ ディスクの消しゴムマークからワイプしてみてください。マウント済みのHDDを削除する場合は共有フォルダを無効化してから共有フォルダの削除をしないとマウント解除できないのでご注意ください。

家庭内LANでの利用を想定しているのでパーミッションはみんなでゲストに許可しています。こうしておくとAndroidでSMBsync使うときに楽です。我が家では毎日5時に録画フォルダとタブレットを同期して録画を持ち出せるようにしています。非常に便利◎

チューナードライバのインストール

我が家はPLEXのPX-W3U4を使用しています。地デジと衛星放送2番組ずつ見れる録れるUSB接続のものです。機種で調べればドライバのインストール方法が出てくるので適宜置き換えてください。

// この後に必要なパッケージ
$ sudo apt install -y raspberrypi-kernel-headers git pcscd libpcsclite-dev libccid pcsc-tools
// kernel-headersの更新を反映させる
$ sudo reboot
// チューナードライバ
$ git clone https://github.com/nns779/px4_drv.git
// ファームウェアのインストール
$ 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 ../
// チューナードライバのインストール
$ cd driver
$ make
$ sudo make install
$ sudo modprobe px4_drv
// ドライバが正しくインストールされているかの確認
$ lsmod | grep -e ^px4_drv
//自分用、まとめて実行
$ sudo apt install -y raspberrypi-kernel-headers git pcscd libpcsclite-dev libccid pcsc-tools 
$ git clone https://github.com/nns779/px4_drv.git && 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 ../
$ cd driver && make && sudo make install && sudo modprobe px4_drv && lsmod | grep -e ^px4_drv

最後のコマンドで「px4_drv     131072   0」と表示されればokです。真ん中の数字は違っていてもokです。カードリーダーを接続して、

$ pcsc_scan

を実行します。最後の行に「Japanese Chijou Digital B-CAS Card (pay TV)」と表示されたらokです。PowerShellだと色がかぶって非常に見づらいです。Ctrl+Cで終了します。

ちなみにここでmake installでエラーでたり、ここでは記載してませんがdkmsでチューナードライバをインストールする際にエラーや「kernel headers for kernel … cannot be found at…」と表示されたらkernelの不整合が起きています。通常これはapt updateとapt install raspberrypi-kernelで問題なく解決されるはずなのですが私の場合ある日突然うまくいかず2日ほど解決に時間を要しました。

// バージョン確認
$ uname -a
$ sudo apt-get install --reinstall raspberrypi-bootloader raspberrypi-kernel
$ sudo reboot
// アップデートを確認
$ uname -a

これでkernel versionのミスマッチが解決されるハズです。

// 再起動
$ sudo reboot now
// チューナーを接続
$ ls /dev/px4video*

最後のコマンドでPX-W3U4なら「/dev/px4video0  /dev/px4video1  /dev/px4video2  /dev/px4video3」と表示されればokです。W3U4は4つチューナーがあるので0~3の4つ表示されます。

復号と録画のツールをインストール

ここまでくれば受信して読み込む準備ができてきます。お次は受信した信号を変換して録画するためのソフトをインストールしていきます。

// この後のコマンドに必要なパッケージ
$ sudo apt install -y cmake autoconf automake ffmpeg
// 地デジ・BS・CSデータを復号化するlibarib25のインストール
$ git clone https://github.com/stz2012/libarib25.git
$ cd ./libarib25/cmake 
$ cmake ..
$ make
$ sudo make install
// 録画コマンドrecpt1 (stz2012版) のインストール
$ git clone https://github.com/stz2012/recpt1.git
$ cd recpt1/recpt1
$ ./autogen.sh
$ ./configure --enable-b25
$ make
$ sudo make install
// 自分用、まとめて実行
$ sudo apt install -y cmake autoconf automake ffmpeg
$ git clone https://github.com/stz2012/libarib25.git && cd ./libarib25/cmake && cmake .. && make && sudo make install 
$ git clone https://github.com/stz2012/recpt1.git && cd recpt1/recpt1 
$ ./autogen.sh 
$ ./configure --enable-b25 
$ make && sudo make install

Mirakurunのインストール

この後インストールするEPGStationの要求を処理してチューナーを制御してくれるMirakurunというソフトをインストールします。MirakurunやEPGStationを動かすのにNode.jsが必要なのですが最新版のMirakurunが動くNode.jsのバージョンが指定されています。GitHubより2021年のMirakurunのバージョン3.9に対応するNode.jsはバージョン16とわかるので、バージョン16を指定してインストールを進めます。

$ cd && curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -
$ sudo apt-get install -y nodejs
// PM2 (プロセスマネージャー) のインストール
$ sudo npm install pm2 -g
// Mirakurunのインストール
$ sudo npm install mirakurun -g --unsafe-perm  --foreground-scripts  --production
// rivarunのインストール
$ sudo npm install rivarun -g
// デコーダーのインストール
$ sudo npm install arib-b25-stream-test -g --unsafe-perm
// チューナーの設定ファイルを開く
$ sudo EDITOR=nano mirakurun config tuners
//自分用、まとめて実行
$ cd && curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash - && sudo apt-get install -y nodejs 
$ sudo npm install pm2 -g && sudo npm install mirakurun -g --unsafe-perm --foreground-scripts  --production
$ sudo npm install rivarun -g
$ sudo npm install arib-b25-stream-test -g --unsafe-perm && sudo EDITOR=nano mirakurun config tuners

以下はPX-W3U4の設定です。以下を追記します。

- name: PX4-S1
  types:
    - BS
    - CS
  command: recpt1 --device /dev/px4video0 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false

- name: PX4-S2
  types:
    - BS
    - CS
  command: recpt1 --device /dev/px4video1 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false

- name: PX4-T1
  types:
    - GR
  command: recpt1 --device /dev/px4video2 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false

- name: PX4-T2
  types:
    - GR
  command: recpt1 --device /dev/px4video3 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false

nanoで開くので、Ctrl+sで上書き保存、Ctrl+xで終了です。ちなみにこの文章のスペースの置き方にはルールがあります。文頭スペースの数が違うとこの後のチャンネルスキャンで

curl: (7) Failed to connect to localhost port 40772: Connection refused

とポートはじかれます。このエラーに2日くらいハマったので残しておきます。

Mirakurunは他のパソコンより“http://ラズパイのIPアドレス:40772/”でWebUIにアクセスできます。Mirakurunを再起動して以下のコマンドを進めていきます。途中のチャンネルスキャンは15分ほどかかります。すべてのチャンネルが表示されなくてものちのちMirakurunが勝手にスキャンするので気にせず進みます。

// Mirakurunを再起動
$ sudo mirakurun restart
// チャンネルスキャン
$ sudo curl -X PUT "http://localhost:40772/api/config/channels/scan"
// Mirakurunを再起動
$ sudo mirakurun restart
// チャンネルスキャンの結果を確認
$ sudo rivarun --list | sed 's/},/},\n/g'
// pm2-logrotateをインストール
$ sudo pm2 install pm2-logrotate

うちの場合チャンネルスキャンでなぜか

curl: (52) Empty reply from server

となりますが特に問題なく運用できてます。チャンネルスキャンの結果はPowerShellだと文字化けしますが気にせず進みます。

EGPStationのインストール

Mirakurunと連携して録画等の操作を可能にするEPGStationをインストールします。バージョンが結構大事なので必要なパッケージが入っているかを確認していきます。

// Node.jsのバージョン確認
$ node --version
// Mirakurunのバージョン確認
$ curl -o - http://localhost:40772/api/version
// FFmpeg、FFprobeのバージョン確認
$ ffmpeg -version
// Pythonのバージョン確認
$ python --version
// GCCのバージョン確認
$ gcc --version

すべてバージョン情報が返ってきたらEPGStationをインストールします。やや時間がかかるので気長に待ちます。

$ cd
$ git clone https://github.com/l3tnun/EPGStation.git
$ cd EPGStation
$ npm run all-install
$ npm run build
//設定ファイルのコピー
$ cp config/config.yml.template config/config.yml
$ cp config/enc.js.template config/enc.js
$ cp config/operatorLogConfig.sample.yml config/operatorLogConfig.yml
$ cp config/epgUpdaterLogConfig.sample.yml config/epgUpdaterLogConfig.yml
$ cp config/serviceLogConfig.sample.yml config/serviceLogConfig.yml
//設定ファイルの編集
$ nano config/config.yml
//自分用、まとめて実行
$ cd && git clone https://github.com/l3tnun/EPGStation.git && cd EPGStation 
$ npm run all-install
$ npm run build
$ cp config/config.yml.template config/config.yml && cp config/enc.js.template config/enc.js && cp config/operatorLogConfig.sample.yml config/operatorLogConfig.yml && cp config/epgUpdaterLogConfig.sample.yml config/epgUpdaterLogConfig.yml && cp config/serviceLogConfig.sample.yml config/serviceLogConfig.yml && nano config/config.yml

設定ファイルをラズパイの環境に合わせて変えてあげます。ご自身の環境に合わせて変えてください。録画ファイルの保存先はOMVのストレージ ⇒ 共有フォルダに表示される絶対パスを張り付ければokです。recordedとその下のthumbnailのpathも変えるようにします。

// ffmpegのパスを変更
ffmpeg: '/usr/bin/ffmpeg'
// ffprobeのパスを変更
ffprobe: '/usr/bin/ffprobe'
// 録画ファイルのファイル名を設定(半角タイトル,年月日)
recordedFormat: '%HALF_WIDTH_TITLE% - %YEAR%-%MONTH%-%DAY%'
// pathで録画ファイルの保存先を設定
recorded:
    - name: Recorded (任意に変更ok)
      path: '絶対パスを張り付け'

thumbnail: '絶対パスを張り付け/thumbnail'

必要なパッケージのインストールはすべて終わったので、途中でインストールしたpm2で自動起動の設定をしてあげます。

$ sudo pm2 startup
$ sudo pm2 start dist/index.js --name "epgstation"
$ sudo pm2 save
// 自分用、まとめて実行
$ sudo pm2 startup && sudo pm2 start dist/index.js --name "epgstation" && sudo pm2 save

動作確認

再起動して必要なソフトがちゃんと起動できているかを確認します。

$ sudo reboot
$ sudo pm2 list

我が家ではこんな表示になりました。

EPGStationで操作するので、“http://ラズパイのIPアドレス:8888/”で番組表などにアクセスできたら成功です。表示が少ないかもしれませんが放送電波や情報取得中です。1時間くらい気長に待ってチャンネルが準備できていれば完成です。

細かい設定に続きます。

コメント

  1. […] 【ラズパイ】Raspberry Pi 4でNASとテレビ録画サーバーを自作 […]

タイトルとURLをコピーしました