ラズパイ４を使った地上波録画サーバーを作る　後編(docker-px4_drv版)


初版：2022/5/28
更新：2023/8/19

[メンテ＆トラブルシューティング](1e439b7cc10822f5ef69)
　∟ [定時診断スクリプト](02a6ea83a1169cd00153)
[前編](614c3973cc7d1439865e)
　１．ラズパイとサーバーの概要
　２．録画に必要なものを集める、購入する
　３．OSのインストールとセットアップ
　４．NASの構築
[後編(docker-dvb版)](0d532fe0859779bb729c)
● 後編(docker-px4_drv版) now!
　５．チューナードライバの導入
　６．docker-mirakurun-epgstationの導入
[後編(非docker版)](3bf7e152fbf73c5ca25e)
　５．チューナーの導入、テスト録画
　６．運用のためのツール、mirakurun、epgstation
[運用実践編](dc099b2f1ab39dad07f7)
　７．録画管理方法
　８．エンコードと再生
　９．システムバックアップ
番外．[まとめ版](0ea0f2ee3cfe5cb8e31e)
番外．[Mirakurunのチャンネル手動設定](28e360d8f678159059e8)
番外．[ラズパイ用ケース作成](237fedc55ac79c9d5723)

非公式ドライバpx4_drvを使った場合です。
対応機種↓　https://github.com/nns779/px4_drv
・PX-W3U4
・PX-Q3U4
・PX-W3PE4
・PX-Q3PE4
・PX-W3PE5
・PX-Q3PE5
・PX-MLT5PE
・PX-MLT8PE
・DTV02-1T1S-U (実験的)
・DTV02A-1T1S-U
・DTV02A-4TS-P
PX-S1UDやQ1UDなどは対応していていません。dvb版の方を参照。

#### チューナー(Plex等)の非公式ドライバ(px4_drv)
多くのPlexチューナーはなぜか公式ドライバでは安定せず(ドロップが多発する？)、非公式ドライバpx4_drvでは安定するとのこと。注意点としては、
・dvb系のコマンドで録画はできない？
・なのでrecpt1コマンドを使う
・そのためdocker-mirakurun-epgstationだけではできない
・内蔵カードリーダーは使えない

#### docker版とは
この後出てくるMirakurunとEPGStationは通常版と仮想化技術を利用しているdocker版とあり、ここから分岐する。EPGStation作者が今後docker版メインにするとのことで、可能ならdocker版にしておきたい。メリットはライブラリ等のバージョン依存を受けにくいこと。デメリットは内部で何をやっているのかわかりにくいこと。

#### そもそもMirakurunやEPGStationは何してる？
Mirakurunやmirakcの役割はチューナーサーバー。複数のチューナーがあり複数の予約録画が入っていても割り当てをしてくれる。また、別のマシンでリアタイで視聴することもできるようになる。
EPGStationやChinachuは別のマシンからブラウザで番組表として確認できるようにできる、予約録画等ができるようにする役割。Mirakurun等からEPGデータを参照している。ホストマシンにある程度のパワーが必要にはなるがブラウザ上でのリアタイ視聴も可能になる。
どちらも別のマシンからアクセスする際に役に立つもの。普段使っているWindowsマシンに直接チューナーをつなげて視聴や予約を行う場合はtvtestで済むので必要ない。

## ５．チューナードライバの導入

ここからチューナー関連の設定を行っていく。流れは
・チューナーのファーム、ドライバを導入
・カードリーダーでB-Casカードを読めるようにする
・録画コマンドrecpt1をインストールする
　（px4_drv対象チューナーではdvbコマンドが使えずrecpt1を入れる必要がある？）
・カードリーダーをストップする
・docker,docker-composeを導入する
・docker-mirakurun-epgstationを導入する
といった流れになります。

#### チューナーのファーム、ドライバを導入する

```ファームウェアとドライバのインストール.
公式ドライバからファームを抽出する
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/

続いてドライバのインストール。最後にmodprobeで読み込ませる
cd ../
＊現在px4_drvディレクトリ
sudo apt -y install raspberrypi-kernel-headers
cd driver
make
sudo make install
sudo modprobe px4_drv

読み込んでいることを確認
ls /dev
---------------
多くのplex
/dev/px4video*
MLT5PE
/dev/pxmlt5video*
MLT8PE
/dev/pxmlt8video*
e-Better DTV02-1T1S-U/DTV02A-1T1S-U
/dev/isdb2056video*
e-Better DTV02A-4TS-P
/dev/isdb6014video*
＊＊＊もしここで読み込んでいない、かつここに至るまでに大きなエラーが見当たらない場合はチューナーの認識の方に問題があることもあるので、ラズパイとチューナー双方の電源を一度切って再度起動して、ls /devを再び試してみてください。
---------------

または
lsmod | grep -e ^px4_drv
---------------
# px4_drv               143360  0
---------------

＊dkmsでカーネルドライバを自動的に設定することもできるが、この解説では行わない
```

```カードリーダー.
sudo apt install -y libpcsclite-dev pcscd pcsc-tools libccid

B-CASカードの認識を確認
pcsc_scan
そのままだと永遠に続くのでCtrl+cで抜ける
dockerで入れる場合はリーダーは事前に停止しておく必要があるとのことで。

1行で
sudo apt install -y libpcsclite-dev pcscd pcsc-tools libccid;timeout 10 pcsc_scan;sudo systemctl stop pcscd.socket
```

```録画コマンドrecpt1.
＊dockerの場合、mirakurunでスクランブル解除が入るようで、事前にb25をビルドしておく必要はないようです。
sudo apt install -y autoconf automake
git clone https://github.com/stz2012/recpt1.git
cd recpt1/recpt1/
./autogen.sh
./configure --enable-b25
make
sudo make install
```

```録画テスト.
b25入れていない場合、録画自体出来ても画面真っ暗なのでそこ考慮してください。
recpt1 --device /dev/px4video0 --lnb 15 --b25 --strip 13 10 test.m2ts
--lnb 15 はBSCSアンテナへの給電が不要/不可能ならなくてOKです。
↓MLT5の場合
recpt1 --device /dev/pxmlt5video0 --b25 --strip 13 10 test.m2ts
```

```リーダーストップ、無効化.
sudo systemctl stop pcscd.socket
sudo systemctl disable pcscd.socket

再び動かす場合は
sudo systemctl start pcscd.socket
sudo systemctl enable pcscd.socket
```

## ６．docker-mirakurun-epgstationの導入

チューナーのドライバ導入までは終わっている前提で進めます。ここからの工程としては、
（・チューナーのドライバを導入：済）
・dockerを入れる
　∟dockerパッケージ導入
　∟python-pipおよび関連パッケージ導入
　　(将来arm用composeバイナリが配布されたら不要に？)
　∟docker-composeパッケージ導入
・mirakurun-epgstation-docker導入
＊docker版でSoftCASをやっている人は見かけません。不可能ではないようですが...

ここら辺にそれぞれのコマンドを書いていく。

```dockerの設定.
dockerパッケージインストール
curl -sSL https://get.docker.com | sh

バージョンの確認
docker -v

権限の追加
sudo usermod -a -G docker $USER

python-pipおよび関連パッケージ導入
　(今後、composeバイナリなどの状況でここら辺は変わるかもしれない)
sudo apt install -y libffi-dev libssl-dev python3 python3-pip python3-dev

docker-composeパッケージインストール
（なおmirakurun-epgstation入れる場合、どのサイトだったかcompose不要という記述があったが、私が試した限りではcomposeは必須のようです。）
sudo pip3 install docker-compose

docker-composeのバージョン確認
docker-compose -v
```

docker-mirakurun-epgstation導入前に一度再起動が必要？いやしなくても大丈夫か

```git cloneでファイルをコピーする。.
いきなりインストールしないのは、編集するファイルがあるため
git clone https://github.com/l3tnun/docker-mirakurun-epgstation -b v2 docker-mirakurun-epgstation

cd docker-mirakurun-epgstation
cp docker-compose-sample.yml docker-compose.yml
```
非公式ドライバの場合はここらへんでいろいろ編集する必要あり

```その他必要なファイルをコピー.
cd docker-mirakurun-epgstation
＊現在docker-mirakurun-epgstationディレクトリ
mkdir mirakurun/run
mkdir mirakurun/opt
mkdir mirakurun/opt/bin
cp -p /usr/local/bin/checksignal mirakurun/opt/bin/
cp -p /usr/local/bin/recpt1* mirakurun/opt/bin/
ls -la mirakurun/opt/bin/
※checksignal、recpt1、recpt1ctlがあることを確認する

サンプルからコピーし作成
cp epgstation/config/config.yml.template epgstation/config/config.yml
cp epgstation/config/operatorLogConfig.sample.yml epgstation/config/operatorLogConfig.yml
cp epgstation/config/epgUpdaterLogConfig.sample.yml epgstation/config/epgUpdaterLogConfig.yml
cp epgstation/config/serviceLogConfig.sample.yml epgstation/config/serviceLogConfig.yml
cp epgstation/config/enc.js.template epgstation/config/enc.js
```

```nano docker-compose.yml
もしくは右クリック等でテキストエディタで編集してもよい
・deviesで、dvbの削除(使わない場合)、使用するデバイスの登録
MLT5の場合、↓を加える
            - /dev/pxmlt5video0:/dev/pxmlt5video0
            - /dev/pxmlt5video1:/dev/pxmlt5video1
            - /dev/pxmlt5video2:/dev/pxmlt5video2
            - /dev/pxmlt5video3:/dev/pxmlt5video3
            - /dev/pxmlt5video4:/dev/pxmlt5video4
dvbは、該当のチューナーをつないでいない場合は削除(コメント化？)
            - /dev/dvb:/dev/dvb

        volumes:
            - ./mirakurun/conf:/app-config
            - ./mirakurun/data:/app-data
とあるので、
            - ./mirakurun/run:/var/run/
            - ./mirakurun/opt:/opt/
を加える

【参考：しなくても普通に動いた】↓を修正する、mariadb:10.5はラズパイだと上手く動作しない、との記載のサイト様あり
    mysql:
        image: jsurf/rpi-mariadb
```

```【参考】公式にある ～～～l3tnun/docker-mirakurun-epgstation/v2/setup.shの内容.
#!/bin/sh

git clone https://github.com/l3tnun/docker-mirakurun-epgstation.git
cd docker-mirakurun-epgstation
cp docker-compose-sample.yml docker-compose.yml
cp epgstation/config/enc.js.template epgstation/config/enc.js
cp epgstation/config/config.yml.template epgstation/config/config.yml
cp epgstation/config/operatorLogConfig.sample.yml epgstation/config/operatorLogConfig.yml
cp epgstation/config/epgUpdaterLogConfig.sample.yml epgstation/config/epgUpdaterLogConfig.yml
cp epgstation/config/serviceLogConfig.sample.yml epgstation/config/serviceLogConfig.yml
docker-compose run --rm -e SETUP=true mirakurun
この内容が終わった後に、↓を実行する
sudo docker-compose up -d
```



この段階で起動自体はできるようになる。
実際には↓の方の録画したファイルの保存場所等の修正をしてからの方がベターです。
ディレクトリ移動してから起動。
＊＊初回は時間がかかるので注意。＊＊
cd docker-mirakurun-epgstation
更新するコマンド？
sudo docker-compose pull
起動コマンド
sudo docker-compose up -d

```バックアップしたchannels.yml server.yml tuners.ymlを使う.
channels.yml等を控えている場合はここで上書き可能に。
デフォだとアクセス権的に上書きできないので修正を
sudo chmod 666 docker-mirakurun-epgstation/mirakurun/conf/*.yml
パミッションを変更するとwin上からsamba経由で上書きコピー可能になる。mirakurun起動中でも可能ですが、その時はmirakurunのUI上などからmirakurunの再起動を行いましょう。
```

OS起動時のスタートアップ設定は特に行う必要はない。

もし停止したい場合。もちろんディレクトリ移動してから。
sudo docker-compose down

```録画したファイルの保存場所.
nano docker-mirakurun-epgstation/docker-compose.yml
　なお、GUIでテキストエディタで開いて編集してもよい。
編集する場所は、epgstation>volumes>recordedの部分について、
- ＜録画ファイルを置く相対パスorフルパス＞:/app/recorded　にする。
docker-mirakurun-epgstationを停止→起動で変更適用されるはずです。
例：　- ./recorded/recorded:/app/recorded
　→　/home/pi/docker-mirakurun-epgstation/recorded/recordedに保存
通常版とは異なるので注意すること。
なお、理由はわからないが、_から始まるフォルダ名を指定すると録画できない現象が発生したので注意。

/home/pi/docker-mirakurun-epgstation/recordedにデータパーティションをマウントして、
その中にrecordedフォルダを作っておけば、
/home/pi/docker-mirakurun-epgstation/recorded/recorded、
つまりデータパーティション/recordedに録画される。
```

個人的にお勧めのフォルダ構造。データパーティションのルートにエンコ済みの動画等を入れておき、recordedフォルダに録画ファイルや定期診断ファイルを入れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547444/dca4907a-5c05-815c-b004-032fc604f191.png)

全てかどうかはわからないが、docker関連はrestartコマンドだと反映されないものもある。その場合、停止コマンドしてから起動コマンドを打てば反映される。
cd docker-mirakurun-epgstation; sudo docker-compose down; docker-compose up -d; cd ~

一方、保存ファイル名(デフォルト)については通常版と考え方は同じ。

```保存ファイル名、他各種設定.
nano docker-mirakurun-epgstation/epgstation/config/config.yml
　なお、GUIでテキストエディタで開いて編集してもよい。
書き換える場所は、recordedformat:の部分。まぁこれは見てわかるでしょう。

チューナー設定
dvbと異なり自動では設定してくれないよう。mirakurunのuiから、もしくはtuners.ymlを編集する。
sudo nano docker-mirakurun-epgstation/mirakurun/conf/tuners.yml

チャンネル設定については、スキャンする方法と手動で設定する方法がある。個人的には、できるなら手動で設定した方が早く確実だと思ってしまう。

チャンネルをスキャンする.
curl -X PUT "http://localhost:40772/api/config/channels/scan"
: '40772はmirakurunのデフォルトのポート'

なお、物理チャンネルとは名前の通り内部で認識している周波数域？のこと。テレビのリモコンとは異なるので注意。
＜例＞リモコン、放送局、物理チャンネル
1　RAB　　28
2　NHKE　13
3　NHKG　16
5　ABA　　32
6　ATV　　30

sudo nano docker-mirakurun-epgstation/mirakurun/conf/channels.yml
docker-mi～フォルダ上で実行する場合
sudo nano mirakurun/conf/channels.yml
```

```設定例：channels.yml　(津軽地方)
- name: NHKEテレ
  type: GR
  channel: '13'
- name: NHK総合
  type: GR
  channel: '16'
- name: RAB青森放送
  type: GR
  channel: '28'
- name: ATV青森テレビ
  type: GR
  channel: '30'
- name: ABA青森朝日放送
  type: GR
  channel: '32'
```


#### Mirakurunのチューナー設定

dockerの場合、自動的に設定してくれるとは言うものの私の場合だと特になし。なので自分で設定するかバックアップ済みのファイルを使うかになると思われます。
PX-MLT5PEの場合

```tuners.ymlの一例.
- name: adapter0
  types:
    - GR
  dvbDevicePath: 
  decoder: arib-b25-stream-test
  command: >-
    recpt1 --device /dev/pxmlt5video0 <channel> - -
- name: adapter1
  types:
    - GR
  dvbDevicePath: 
  decoder: arib-b25-stream-test
  command: >-
    recpt1 --device /dev/pxmlt5video1 <channel> - -
- name: adapter2
  types:
    - GR
  dvbDevicePath: 
  decoder: arib-b25-stream-test
  command: >-
    recpt1 --device /dev/pxmlt5video2 <channel> - -
- name: adapter3
  types:
    - GR
  dvbDevicePath: 
  decoder: arib-b25-stream-test
  command: >-
    recpt1 --device /dev/pxmlt5video3 <channel> - -
- name: adapter4
  types:
    - GR
  dvbDevicePath: 
  decoder: arib-b25-stream-test
  command: >-
    recpt1 --device /dev/pxmlt5video4 <channel> - -
```

余談。dockerの起動と停止
各dockerインストールフォルダへ移動して、
停止
sudo docker-compose down
起動
sudo docker-compose up -d
再起動
sudo docker-compose restart

##### dockerについてのコマンド
```主にコンテナの扱いについて.
現在動いているコンテナ
docker ps
全コンテナ(動いている+動いていない)
docker ps -a
コンテナの削除
docker rm [コンテナID]
コンテナ全削除
docker rm `docker ps -a -q`
```


##### 信号の強さの計測例
recdvbが1.3.3以上(あるいはパッチ済み)を前提とします。
～USB接続で地デジ4チャンネル録画できるチューナーPX-Q1UDを略～さんによると。
CNRが20以上？、ERRBLKが0、SIGの値がある程度小さい(-45くらい？まで下がっている)と大丈夫っぽい？。
スクリプト等は[メンテ＆トラブルシューティング](1e439b7cc10822f5ef69)参照

#### 録画時のトラブル
運用を行っていくと、なぜか録画が行われないといったトラブルに見舞われることがある。そんな時どこをチェックするか。
[メンテ＆トラブルシューティング](1e439b7cc10822f5ef69)
・mirakurunの状況を確認(http://192.168.1.**:40772/ )。


次の章はこちら→[運用実践編](dc099b2f1ab39dad07f7)
[後編(docker-dvb版)](0d532fe0859779bb729c)
[後編(非docker版)](3bf7e152fbf73c5ca25e)