はじめに

今般、Raspberry Pi 5(以下、RPi5と呼称)でBS4K放送を録画する方法が分かったため、ここに忘備録としてそれをメモする。

ハードウェアを準備する

今回、通称PT4Kと呼ばれるPCI Express 1x(以下、PCIe1xと呼称)接続のTVチューナーカードを使用する。そこでRPi5のPCIe1xの信号線を物理的な同規格のスロットへ変換するP02と呼ばれるインタフェース変換ボードを用いることとする。なお、P02のPCIe1xの電源供給は、RPi5がもつ5Vを供給するGPIOピンからで問題ない模様である。

 

以下のハードウェアをあらかじめ準備する。

  • Windows PC
  • Raspberry Pi 5(メモリ8GB)
    • 27W Type-C 電源アダプタ
    • MicroSDカード
    • MicroSDカードリーダ/ライタ
  • PCIe1x 変換モジュール: P02
  • TVチューナカード: PT4K
  • ACASカード
  • カードリーダ: SCR3310 v2.0

ソフトウェアを準備する

以下の手順でソフトウェアをセットアップする。

MicroSDカードにRaspberry Pi OSをインストールする

このWebサイトからMicroSDカードにRaspberry Pi OSをインストールするためのツールであるRaspberry Pi Imagerをダウンロード、及びインストールする。
 
PCにMicroSDカードを挿入後、Raspberry Pi Imagerを起動する。以下の画面が表示されるため、Raspberry Pi 5を選択し、次へを選択する。
 
 
インストールするOSとしてRapsberry Pi OS (64bit)を選択し、次へを選択する。
 
 
インストール先のドライブを選択し、次へを選択する。
 
 
ホスト名を入力し、次へを選択する。
 
 
ロケール、タイムゾーン、及びキーボードのレイアウトを選択し、次へを選択する。
 
 
アカウントを設定後後、次へを選択する。
 
 
Wifiの接続情報を入力後、次へを選択する。
 
 
SSHの有効/無効を設定し、次へを選択する。
 
 
遠隔でRPi5を操作するRaspberry Pi Connectの有効/無効を設定し、次へを選択する。
 
 
設定後確認し、WRITEを選択する。
 
 
Rapsberry Pi OSを書き込むデバイスを確認後、I UNDERSTAND, ERASE AND WRITE(私は理解し、消去し、書込む)を選択する。
 
 
Raspberry Pi OSのインストールが完了すると以下の画面が表示されるため、FINISHを選択する。
 
 
RPi5にRaspberry Pi OSのインストールされたMicroSDカードを挿入し、モニタとRPi5をHDMIケーブルでつないだから、RPi5の電源を投入する。
 
電源投入後、モニタにデスクトップ画面が表示されることを確認できたら、以後はWindows PCからのSSH接続で操作することとする。これは、RPi5はサーバとして使用するため、必ずしもグラフィカルな操作は必要としないことによる。
 
Windows PC上でコマンドプロンプト画面を起動し、以下のコマンドでRPi5にSSHで接続できることを確認する。
$ ssh ユーザ名@RPi5のIPアドレス

OSをアップデートする

以下のコマンドでOSを最新の状態へ更新する。はじめにパッケージのリストを更新する。
$ sudo apt update
パッケージのリストにしたがってパッケージを更新する。
$ sudo apt upgrade
RPi5を再起動する。
$ sudo reboot

ブート時のオプションを設定する

RPi5でPT4Kを動作させるためには、/boot/firmware/config.txtに以下の設定を追加する必要がある。
[all]
dtoverlay=pcie-32bit-dma
設定を反映するため、RPi5を再起動する。
$ sudo reboot

RPi5にPT4Kのドライバをインストールする

以下のサイトで公開されているLinux向けのPT4KのドライバをRPi5にインストールする。
$ git clone https://github.com/otya128/tbs6812_drv.git
$ cd tbs6812_drv
$ make -C "/lib/modules/$(uname -r)/build" "M=$(pwd)" tbs6812.ko cxd2857.ko
ドライバをビルド後、以下のコマンドでドライバをロードする。
$ sudo modprobe dvb-core
$ sudo insmod ./cxd2857.ko
$ sudo insmod ./tbs6812.ko
以下のコマンドでチューナーカードが認識されていることを確認する。
$ lspci
$ 0000:01:00.0 Multimedia controller: TBS Technologies DVB Tuner PCIe Card
以下のコマンドでチューナーカードのドライバが正常にロードされていることを確認する。
$ dmesg | less
[  387.679312] cxd2857: loading out-of-tree module taints kernel.
[  394.849326] TBS6812 driver 0001:01:00.0: enabling device (0000 -> 0002)
[  394.849417] TBS6812 driver 0001:01:00.0: Turbosight TBS 6812 (Dual ISDB-T/S/S3)
[  394.850652] dvbdev: DVB: registering new adapter (TBSECP3 DVB Adapter)
[  394.961815] TBS6812 driver 0001:01:00.0: MAC address 00:22:ab:b2:1d:6c
[  394.962309] i2c i2c-15: Detect CXD2857 chip.
[  394.962317] TBS6812 driver 0001:01:00.0: DVB: registering adapter 0 frontend 0 (Turbosight TBS 6812 (Dual ISDB-T/S/S3))...
[  394.962420] dvbdev: DVB: registering new adapter (TBSECP3 DVB Adapter)
[  395.073820] TBS6812 driver 0001:01:00.0: MAC address 00:22:ab:b2:1d:6d
[  395.074316] i2c i2c-16: Detect CXD2857 chip.
[  395.074324] TBS6812 driver 0001:01:00.0: DVB: registering adapter 1 frontend 0 (Turbosight TBS 6812 (Dual ISDB-T/S/S3))...
[  395.074410] TBS6812 driver 0001:01:00.0: Turbosight TBS 6812 (Dual ISDB-T/S/S3): PCI 0001:01:00.0, IRQ 188, MMIO 0x1b80000000
以下のコマンドでチューナーカードがデバイスファイルとして認識されていることを確認する。
$ ls /dev/dvb
$ adapter0  adapter1
ここまでで問題がなければ、RPi5の起動時に自動的にドライバがロードされる設定をする。
$ sudo cp /path/to/tbs6812_drv/cxd2857.ko /lib/modules/$(uname -r)/kernel/drivers/media/tuners/
$ sudo cp /path/to/tbs6812_drv/tbs6812.ko /lib/modules/$(uname -r)/kernel/drivers/media/tuners/
$ sudo depmod
以下の設定ファイルに以下を追加する。
  • /etc/modules-load.d/modules.conf
cxd2857.ko
tbs6812.ko
上記コマンドを実行後、RPi5を再起動し、下記のコマンドでチューナーカードのドライバが自動でロードされていることを確認する。
$ lsmod | grep cxd2857
$ lsmod | grep tbs6812

録画プログラムをインストールする

録画プログラムであるrecdvbをインストールする。はじめにrecdvbをビルドするために必要となるツールをインストールする。
$ sudo apt install autoconf automake
次にGitHubからソースコードをクローンする。
$ git clone https://github.com/otya128/recdvb.git
BS4Kのチャンネル選局に対応するため、pt1_dev.hを入れ替える。
$ cd recdvb
$ mv pt1_dev.h pt1_dev.h.original
$ wget https://raw.githubusercontent.com/jp-dtv-4k/DMirakurun/refs/heads/master/recdvb/pt1_dev.h
ビルドし、インストールする。
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install

チューナサーバをインストールする

PT4KをWeb APIで制御できるようにするチューナサーバMirakurunをインストールする。MirakurunはNode.js上で実行されるため、はじめに実行環境であるnode.jsをインストールする。
$ apt install npm
次にBS4K放送に対応するMirakurunをクローンする。
$ git clone https://github.com/otya128/MMirakurun.git
本リポジトリが参照している外部のリポジトリを取り込む。
$ git submodule update --init --recursive
Mirakurunの動作に必要な依存パッケージをインストールする。
$ npm install
ビルドする。
$ npm run build
当環境の場合、ビルド時に以下のようないくつかのエラーが発生した。
/home/pi/Downloads/MMirakurun/src/Mirakurun/TSFilter.ts:577:35
ERROR: 577:35  trailing-comma  Unnecessary trailing comma

/home/pi/Downloads/MMirakurun/src/Mirakurun/api/config/channels/scan.ts:320:39
ERROR: 320:39  trailing-comma  Unnecessary trailing comma
本エラーは、不必要な場所に「,」(カンマ)が所在していることを表している。このため、TSFilter.tsの577行目にある以下の赤文字を削除する。
            const channels: db.Channel[] = tsIdList.map(tsid => ({
                type: channelType,
                channel: `${tsid}`,
            }));
同様にscan.tsの320行目にある以下の赤文字を削除する。
                result.push({
                    name: c.channel,
                    type,
                    channel: c.channel,
                });
Mirakurunの起動/停止を管理するためプロセスマネージャpm2をインストールし、pm2にMirakurunを登録する。
$ sudo npm install pm2 -g
$ sudo pm2 startup
$ sudo pm2 start processes.json
$ sudo pm2 save
チューナの設定ファイルを設定する。以下の設定ファイルを以下のように設定する。このとき、空白文字に注意する。「--dev 0/1」と「<channel>」の間に空白文字が余分にあるとMirakurunが正常に動作しない模様である。
  • /usr/local/etc/mirakurun/tuners.yml
- name: PT4K-0
  types:
    - BS4K
  command: recdvb --dev 0 <channel> - -
  isDisabled: false
- name: PT4K-1
  types:
    - BS4K
  command: recdvb --dev 1 <channel> - -
  isDisabled: false
チャンネルの設定ファイルを設定する。以下の設定ファイルを以下のように設定する。
  • /usr/local/etc/mirakurun/channels.yml
- name: BS朝日 4K
  type: BS4K
  channel: BS07_0
  isDisabled: false
- name: BSテレ東4K
  type: BS4K
  channel: BS07_1
  isDisabled: false
- name: BS日テレ 4K
  type: BS4K
  channel: BS07_2
  isDisabled: false
- name: NHK BSP4K
  type: BS4K
  channel: BS17_0
  isDisabled: false
- name: BS-TBS 4K
  type: BS4K
  channel: BS17_1
  isDisabled: false
- name: BSフジ4K
  type: BS4K
  channel: BS17_2
  isDisabled: false
チューナとチャンネルの各設定を反映するため、Mirakurunを再起動する。
sudo pm2 restart mirakurun-server
Windows PC上にあるEdgeなどのブラウザで「http://RPiのIPアドレス:40772」にアクセスして以下のような画面が表示されることを確認する。
 

予約録画アプリをインストールする

最後にEPGStationと呼ばれる予約録画アプリをインストールする。以下のコマンドでソースコードをクローンする。
$ git clone https://github.com/otya128/EPGStation.git
以下のコマンドでインストールする。
$ cd EPGStation
$ npm run all-install
$ npm run build
設定ファイルを設定する。
$ cp config/config.yml.template config/config.yml
$ cp config/operatorLogConfig.sample.yml config/operatorLogConfig.yml
$ cp config/epgUpdaterLogConfig.sample.yml config/epgUpdaterLogConfig.yml
$ cp config/serviceLogConfig.sample.yml config/serviceLogConfig.yml
$ cp config/enc.js.template config/enc.js
プロセスマネージャpm2にEPGStationを登録する。
$ sudo pm2 start dist/index.js --name "epgstation"
$ sudo pm2 save
このとき、当環境の場合、以下のエラーが発生した。
$ sudo pm2 logs epgstation
1|epgstation  | initialize error
1|epgstation  | Error: setgid() disabled: io_uring may be enabled. See CVE-2024-22017.
1|epgstation  |     at process.setgid (node:internal/bootstrap/switches/does_own_process_state:88:22)
1|epgstation  |     at init (/home/pi/Downloads/EPGStation/dist/index.js:61:25)
1|epgstation  |     at /home/pi/Downloads/EPGStation/dist/index.js:143:15
1|epgstation  |     at Object.<anonymous> (/home/pi/Downloads/EPGStation/dist/index.js:154:3)
1|epgstation  |     at Module._compile (node:internal/modules/cjs/loader:1529:14)
1|epgstation  |     at Object.Module._extensions..js (node:internal/modules/cjs/loader:1613:10)
1|epgstation  |     at Module.load (node:internal/modules/cjs/loader:1275:32)
1|epgstation  |     at Function.Module._load (node:internal/modules/cjs/loader:1096:12)
1|epgstation  |     at Object.<anonymous> (/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js:32:23)
1|epgstation  |     at Module._compile (node:internal/modules/cjs/loader:1529:14) {
1|epgstation  |   code: 'ERR_INVALID_STATE'
1|epgstation  | }

そこで、index.js(EPGStation/dist/)の以下のコードを削除する。

    if (process.platform !== 'win32' && typeof process.getuid !== 'undefined' && process.getuid() === 0) {
        // gid
        if (typeof process.setgid !== 'undefined') {
            if (typeof config.gid === 'string' || typeof config.gid === 'number') {
                process.setgid(config.gid);
            }
            else {
                process.setgid('video');
            }
        }
        // uid
        if (typeof process.setuid !== 'undefined') {
            if (typeof config.uid === 'string' || typeof config.uid === 'number') {
                process.setuid(config.uid);
            }
        }
    }
EPGStationを再起動する。
$ sudo pm2 restart epgstation
Windows PCのEdgeなどのブラウザから「http://RPi5のIPアドレス:8888」にアクセスして以下のような番組表を見れることを確認する。