【ラズパイ】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で進めます。

上の写真はちょっと昔の。デバイスがRaspberry pi 4の場合はRasperry Pi OS (other) ⇒ Raspberry Pi OS Lite (32-bit)を選択してください。

起動ディスクは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接続のものです。お持ちの機種で調べればドライバのインストール方法が出てくるので適宜置き換えてください。

最初にエラー回避のために更新とブートファイルを変更します。

//karnel-headerの明示的なアップデート
$ sudo apt install -y raspberrypi-kernel-headers
$ sudo nano /boot/config.txt
//[all]の上に2行追記
[pi4]
arm_64bit=0
//変更反映のために再起動
$ sudo reboot

nanoで開くので、Ctrl+sで上書き保存、Ctrl+xで終了です。再起動してSSH接続完了したらちゃちゃっと進めていきます。

// このステップで必要なパッケージ
$ sudo apt install -y 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 git pcscd libpcsclite-dev libccid pcsc-tools
$ 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

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

$ pcsc_scan

を実行します。最後の行に「Japanese Chijou Digital B-CAS Card (pay TV)」と表示されたらokです。Ctrl+Cで終了して再起動します。

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

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

Kernel headのエラー

もしここで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 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というソフトをインストールします。2024.01最新のMirakurun 3.9.0-rc.4で推奨されているNode.jsのインストール方法だとエラーになるので公式パッケージでNode.js をインストールします。指定せずともv18.13.0だったのでヨシとします。また、Mirakurunをバージョン指定なしでインストールするとこの後のEPGStationでなぜかエラーになるのでMirakurun 3.9.0-rc.4を明示的に指定しています。

//Mirakurun推奨のNode.jsインストール方法
$ cd && curl -sL https://deb.nodesource.com/setup_18.x | sudo -E bash -
$ sudo apt-get install -y nodejs
//上でだめなら公式パッケージからインストールしてバージョン確認
$ sudo apt install -y nodejs npm
$ sudo node -v
// PM2 (プロセスマネージャー) のインストール
$ sudo npm install pm2 -g
// Mirakurunのインストール
$ sudo npm install mirakurun@3.9.0-rc.4 -g --unsafe-perm  --foreground-scripts  --production
// rivarunのインストール
$ sudo npm install rivarun -g
// デコーダーのインストール
$ sudo npm install arib-b25-stream-test -g --unsafe-perm
// チューナーの設定ファイルを開く
$ sudo nano /usr/local/etc/mirakurun/tuners.yml
//自分用、まとめて実行
$ cd && curl -sL https://deb.nodesource.com/setup_18.x | sudo -E bash - && sudo apt-get install -y nodejs 
$ sudo npm install pm2 -g && sudo npm install mirakurun@3.9.0-rc.4 -g --unsafe-perm --foreground-scripts  --production
$ sudo npm install rivarun -g
$ sudo npm install arib-b25-stream-test -g --unsafe-perm
$ sudo nano /usr/local/etc/mirakurun/tuners.yml

デフォルトではPT3-S1に設定が入っているかと思います。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

この文章のスペースの置き方にはルールがあります。文頭スペースの数が違うとこの後のチャンネルスキャンで

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

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

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

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

チャンネルスキャンの結果は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がUIになるので“http://ラズパイのIPアドレス:8888/”で番組表などにアクセスできたら成功です。セットアップ終わって数時間は表示がまったくなかったり少ないかもしれませんが放送電波や情報取得中です。3時間くらい気長に待ってチャンネルが準備できていれば完成です。何も映らないからって失敗したわけじゃないですよ。

細かい設定に続きます。

コメント

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

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