RasberryPi 4でTV録画サーバーを作る

※内容は2024/02/22時点で実行している手順です。記載している情報は随時アップデートし、過去に行っていた不必要な設定情報は全て削除していますので、あらかじめご了承ください。

RasberryPi 4で地デジ4ch同時TV録画サーバーを仕立て上げました。

過日HDDレコーダーの故障によりバックアップ不能な5年分の録画データをロストした際に結構なショックを受けたので、二度とこのような思いをしないように録画データをバックアップできる環境が欲しくなったというのが発端です。

そこで、ネットにある情報を頼りに機材を購入し、セットアップしてみたところ、市販のHDDレコーダーよりもはるかに便利であることがわかりました。具体的には以下の点でメリットがあります。

  • 録画データを他のストレージにバックアップできるようになる
  • 録画データからCMを削除でき、MP4ファイルへ変換することで最終保存ファイルの再生時間とファイルサイズを自在に縮小できる
  • 録画データの再生方法に縛りがない
  • 4chの地デジ受信ができ、録画ファイルを再生する際にはチューナーを利用しないので、同時視聴・同時録画による視聴制限を受けることが事実上発生しない
  • 録画予約やファイル整理に専用アプリを必要とせず、ブラウザ上の広い画面で操作でき、文字の入力にPC・スマホ・タブレットのキーボードを使えるので操作性がいい
  • スマホやタブレットに録画番組をローカルに保持して再生できる
  • 一度セットアップしてしまえばメンテナンスフリーでHDDレコーダー並に安定稼働する
  • ハード故障時の復旧も故障箇所のハードウェアの入れ替えでほぼ完了できる
  • 待機電力は4W、録画時も8W弱程度で消費電力が低い
  • 設置面積が市販HDDレコーダーの1/4以下で済む

NHKニュース・全映画・全ドラマを自動録画し、リアルタイム視聴をして負荷をかけて1週間動作させてみたところ動作は非常に安定しているので、今後市販のHDDレコーダーに戻ることはなさそうです。

しかし、これらの設定と手順はネット上に散逸しており、検索をしても古い情報が出てきたりするので、後日同じ設定をしようとしても時間がかかります。そこで、検証を重ねて確定させたセットアップの最小手順、及び設定内容と設定の意味を忘れないようにメモしておきます。

目指すTV録画サーバー仕様について

RasberryPiで録画サーバーを組み上げるときに選択できる機能は数多くあるので野放図に設定をすると仕様が一向に固まらず、設定に終わりが見えなくなります。そこで、ここでは下記の条件に留意しつつ設定手順を記載しています。

  • 完全ヘッドレスで初期セットアップからメンテナンスまで行えるようにする
  • OSはmicroSDで運用し、外付けストレージには録画データのみを保存する
  • OSが書かれているmicroSDへの書き込みを極力抑えて、microSDの故障率を下げるようにする
  • 設定値はできるだけデフォルトのものを使用し、一から復旧する際の手順を単純化する
  • RasberryPi上での処理はm2tvでのTV録画と録画データの外部転送のみとする。エンコードなどCPUに負荷がかかる機能は使わない
  • DBの不整合などを避けるため、録画ファイルの管理はEPG stationでのみ行い、コンソールやSamba経由では行わない
  • 設定については安定稼働と管理コストの最小化を最優先事項とする

準備するもの

RasberryPiで録画サーバーを製作するにあたり、準備したものは以下のとおりです。

  • Rasberry Pi 4(8GB)
  • RasberryPi用ケース
  • 12V 20W充電器 & USB-Cケーブル(最大電流3A対応)
  • SSD/HDD(USB接続外付けストレージ)
  • 32GB 高耐久microSD
  • 4ch地デジチューナー
  • カードリーダー & B-CASカード

Rasberry Pi 4

RasberryPi 4はメモリサイズが1GB、2GB、4GB、8GBのものがあります。ネットの動作情報を見ると4GBのもので問題なく動作しているようなので、4GBのものでも動作すると思います。ただし、仮想メモリをOFFにした場合に安定動作するかはわからず、今後ソフトのアップデートなどでメモリを必要とすることもあるかもしれませんので、8GBのものを購入するほうが安心です。

RasberryPi 4本体の購入はMouserが一番安かったです。

RasberryPi用ケース

ケースとしては「Argon ONE Raspberry Pi 4 Case V2」と「DeskPi Pro」が候補になりました。

Rasberry Pi用として安価で売られている小型プラケースはファンの電源をGPIOから取っていて、冷却ファンが壊れて停止した時に急な電流値の上昇によりRasberryPiが過電流で故障することがあります。このことから安い小型プラケースでは、年単位で常時稼働させるには心許ないです。

また、Rasberry Piで録画中はそこそこ熱くなりますので、放熱性能と頑丈さを鑑みて金属ケースの「Argon ONE Raspberry Pi 4 Case V2」と「DeskPi Pro」を候補としました。

これらのケースはHDMIコネクタをフルサイズのものに変換するので、トラブル対応時にモバイルモニタに付属しているHDMIケーブルを使用してモバイルモニタに接続できる利点があります。

これらのケースは電源を常時通電状態にできるので、停電時復帰時に自動で再起動がかかります。もし電源ボタン付きのケースを録画がサーバーにする場合は、電源接続時に通電状態になるかを確認しましょう。

なお、発熱に関しては下記YouTube動画で検証してくれていて、冷却ファンでRasberryPiを冷やしていれば問題は発生しない、すなわち冷却ファンのあるケースであれば問題ないと判断できます。

Argon ONE Raspberry Pi 4 Case V2

録画用HDDにUSB接続の外付けHDDを利用する場合は、Argon ONE Raspberry Pi 4 Case V2がおすすめです。

https://argon40.com/products/argon-one-v2-case-for-raspberry-pi-4

Argon ONE Raspberry Pi 4 Case V2は安価なわりに頑丈な金属ケースで、放熱はこの金属ケースが担います。また、映像出力が標準サイズのHDMIなので、セットアップやトラブル時などにディスプレイを接続する場合、micro HDMIのケーブルを用意せずに済む特徴もあります。

稼働中にファンが動作することはほどんどなく、録画中に寝室に置いても動作しているかどうかわからないくらいでした。

私はこのケースを利用したので、以降の記載はこのケースの利用を前提としています。

こちらはMouserが一番安かったです。

DeskPi Pro

録画用HDDをRasberryPiと同じケースに入れて利用したい場合は、DeskPi Proがおすすめです。https://www.seeedstudio.com/DeskPi-Pro-Set-top-Box-For-Raspberry-Pi-4-p-4704.html

DeskPi ProはHDD/SSDを内蔵できることが特徴で、映像出力がArgon ONE Raspberry Pi 4 Case V2と同様に標準HDMIになります。ただし、値段は1万円以上でちょっと高いです。

DeskPi Proはケース内空間に余裕があり、RasberryPiには大きな放熱フィンが付けられ、放熱用のファンの電源をRasberryPiからとっていないので、連続運転環境用のケースとしては安心感があります。

また、DeskPi ProはRasberryPiにスタックする位置ではなく、横に並べる形でHDD/SSDを内蔵するのでRasberryPi本体からSSDの熱から離せる特徴もあります。SSDを内蔵できるケースは他にもありますが、SSDの発熱を考えると内部空間に余裕があるDeskPi Proが安心です。

録画中の動作音もArgon ONE Raspberry Pi 4 Case V2と同様に、寝室に置いても動作しているかどうかわからないくらいでした。

こちらもMouserが一番安かったです。

microSD

環境セットアップ後のmicro SDの使用ファイルサイズは8GB程度なので、microSDの容量は16GBあれば十分です。ここでは32GBのものを使用しており、容量は過剰にはなりますが、入手性が良く価格も手頃で偽物を掴まされる危険が少ない点で、32GBのものを選択しています。

なお、TV録画サーバーは長期間連続運用するので、熱と書き込み回数に対して耐久性のある高耐久のものが必須です。購入時はバックアップや故障に備えて2枚購入しておくといいです。

12V 20W充電器 & USB-Cケーブル

充電器はUSB-AタイプのものがDeskPi Proに付属しています。ただし、電源投入時の突入電流がわずかに足りないせいか、TVチューナーを接続した状態で再起動するとTVチューナーの動作が不安定になることを確認しています。

USB-Aタイプの充電器は規格上限が18WのためUSB-Aタイプのものは選択せず、USB-C出力の20WのUSB-C接続充電器を別途購入する必要があります。ダイソーでも700円程度で売っていますが、常時通電するものなので、Anker製など少しでも信頼性の高いものを選択する方が安心です。

充電ケーブルは3A対応のものであれば100均のもので問題はないです。

USB接続外付けストレージ

録画用ストレージは常に書き込み処理が走り故障のリスクが高いため、録画用ストレージは消耗品と考え、録画データの一時置き場扱いと考えたほうがいいです。このため、録画データはこまめにバックアップしておくようにします。

いつ壊れてもいいという前提で運用するので、きちんと動作すれば古いPCから抜き出したものを再利用するといいです。

ストレージとRasberry PiはUSBで接続するので、Rasberry Piからの電力を必要とする2.5インチHDDではなく、外部電源で動作する3.5インチHDDか消費電力の少ないSSDを使った方が録画サーバーの安定性の点で安心です。

録画データのファイルサイズは1時間あたり7.5GBになるため、100時間以上の録画データを保存できる様に1GB以上のHDD/SSDが使いやすいです。

なお、外付けストレージはHDD/SSDを問わず、外部電源で動作するケースを用意する必要があります。電力消費が少ないSSDでもRasberryPiのUSBに差した場合は数分録画しただけで、USBからの電力供給がたりず強制アンマウントされてしまいます。DeskPi Proについては問題はありませんでした。

4ch地デジチューナー

地デジチューナーは導入のしやすさの点でPLEX製のものを選択することになります。

我が家ではBS/CSは見ないので地デジ4chチューナーで十分です。ですのでPX-Q1UDを購入しました。

BSを録画する場合はPX-Q3U4を購入すればいいですし、動作に必要なドライバは同じようですので、後で追加購入しても差し替えるだけで動作すると思います。

※PX-Q1UDを2台導入したところ、1台は在京TVの全チャンネルの4チューナー同時録画ができましたが、もう一台は2つのチューナーのNHK総合、Eテレ、テレ朝で信号強度不足によるブロックノイズが発生しました。TVチューナーを購入したら、後述する電波強度の測定方法でチューナーの電波強度を計測し、不都合がある場合は交換対応をお勧めします。

カードリーダー & B-CASカード

カードリーダーはEPG stationにドライバが同梱されているSCR3310を利用するのが安心です。そのほかでもネット上で動作確認されているものであればなんでもいいと思います。

B-CASカードについてはは古いテレビやHDDレコーダーのものを使います。2160円でB-CASカードを入手する方法もあるようです。

実際に購入したもの

参考までに購入時の注文画面のキャプチャを貼っておきます。

ハードウェア組み立て

Rasberry Pi 4をArgon ONE Raspberry Pi 4 Case V2に取り付ける

説明書に従って接続し、ネジ止めすれば大丈夫です。ネジが多くあるので、無くさないように小皿を準備しておくと良いです。

ネットワーク接続方法

無線LAN接続では録画データをコピーするときの転送速度が遅すぎるため、ネットワーク接続は有線LAN接続一択です。

RasberryPi OSをセットアップする

セットアップはディスプレイがなくてもできますが、できるだけディスプレイは接続しておいた方がいいです。ディスプレイに起動メッセージが表示されるので、エラーがある場合にすぐに対処ができ、手戻りの発生を防げます。

動作確認ができたあとにディスプレイを外して安定動作確認をする方が、トラブルシュート時の効率がいいです。

SDカードにRasberryPi OSをインストールする

まずmicroSDをPCに挿して認識させます。

Rasberry Pi imagerでSDカードにOSイメージを書く前に、ウィンドウ右下の歯車アイコンを選択して表示されるAdvanced Optionを以下のように指定しておきます。

username(ユーザーアカウント名)はセキュリティの観点からデフォルトの’pi’は使用せず、’tv-recorder’としています。以降、ユーザーアカウント名は’tv-recorder’として記載します。

OSは「RASBERRY PI OS LITE(64-BIT)」を選択し、Storageには差し込んだmicroSDを選択して「WRITE」ボタンを押します。すると書き込みが始まり、2分程度で書き込みとVerifyが完了します。

書き込みが完了したら、microSDをDeskPi Proに差し込み電源を入れます。すると数回の再起動の後にログインプロンプトが画面に表示されます。

IPアドレスを固定する

電源を投入してLANに繋がったら、FingなどでネットスキャンをしてRasberry PiのIPアドレスとMacアドレスを特定します。

我が家ではクライアント側のIPアドレスはすべてDHCPで割り振るようにしており、IPアドレスを固定する必要がある機器(NASやWebサーバーなど)はルーターが固定のIPアドレスを渡すようにしています。Rasberry PiのMACアドレスはFingなどのLAN scannerを利用すれば特定できるので、このMACアドレスに対して固定IPを渡すように設定することで、OS再インストール時も常にRasberry Piに固定IPが割り当てられるようになります。

Kernel起動時にエラーが出ていないかを確認する

RasberryPiが起動したら、dmesgコマンドで起動時にKernelが致命的なエラーを吐いていないかを確認しましょう。

もしmicroSDカードに異常がある場合、dmesgの表示は以下のようになります。このmicroSDカードをOSディスクにした時は再起動時にカーネルパニックが頻発しました。このような場合はmicroSDを交換して対応します。

ロケールを日本語に変更する

RasberryPiのデフォルトロケールは’en-GB.UTF-8’です。録画ファイルのファイル名は日本語で表記されるため、このままではファイルリストを表示したときなどにファイル名が文字化けしてしまい、各種作業の確認が困難になります。日本語表記のファイル名が正しく表示できるようにするため、ロケールを’ja-JP.UTF8’に変更します。

変更には下記コマンドを実行して、ロケールを変更します。

$ sudo raspi-configCode language: Bash (bash)

RasPi configが起動したら、’5. Localisation Option > L1. Locale’を選択します。

Package configuration画面が表示されたら、’en_GB.UTF-8’のチェックを外し、’jp_JP.UTF-8’にチェックを入れ、OKを選択します。

RasPi configをクローズする際にデフォルトロケールの選択画面が表示されるので、’ja_JP.UTF-8’を選択してOKを選択します。

ロケール変更が終わったら、.bashrcの最終行にロケール宣言を追記します。

$ vi ~/.bashrc
---
...
export LC_CTYPE=ja_JP.UTF-8

必須ソフトをインストール・アップデートする

下記コマンドを実行してRasberry Pi OSをアップデートします。

$ sudo apt update
$ sudo apt upgrade -yCode language: Bash (bash)

下記コマンドを実行してgitをインストールします。

$ sudo apt install -y gitCode language: Bash (bash)

下記コマンドを実行してvimをアップデートします。

$ sudo apt --purge remove vim-common vim-tiny
$ sudo apt install vim
$ vi --version
VIM - Vi IMproved 8.2 (2019 Dec 12, compiled Oct 01 2021 01:51:08)
...Code language: Bash (bash)

録画データのフォルダ名・ファイル名は日本語になるため、コマンドラインでの録画ファイルの整理はかなりの手間になります。この問題を解決するため、FDもインストールしておきます。

$ sudo apt-get install fdcloneCode language: JavaScript (javascript)

また、意図せずにディスクがいっぱいになったときにディスクを占有しているファイルやフォルダを特定できるようにするため、ncduもインストールしておきます。

$ sudo apt-get install ncdu Code language: JavaScript (javascript)

ケース用のドライバをインストールする

Argon ONE PI4 V2

下記コマンドを実行して’Argon ONE PI4 V2 Power button & Fan control’をインストールします。実行後、常に動作していたファンの音がしなくなることが確認できます。

$ curl https://download.argon40.com/argon1.sh | bashCode language: JavaScript (javascript)

argonone-configでCPUの温度ごとにファンの速度を変えることができますが、これはデフォルトのままで良さそうです。

室温28度の条件下でCPU温度を計測したところ、何も動作させていない状態で42-45度、4ch同時録画中で52度くらいでした。ArgonOneの設定値は55度で10%、60度で55%、65度で100%でファンが駆動する設定で、CPUクロック低下は80度を超えた時ですので、デフォルト値で十分と判断しています。

Desk Pi Proの場合

下記コマンドを実行してファンのコントロール用ドライバをインストールします。インストーラーを実行すると再起動がかかり、ファンが停止していることがわかります。

$ cd ~
$ git clone https://github.com/DeskPi-Team/deskpi.git
$ cd ~/deskpi/
$ chmod +x install.sh
$ sudo ./install.shCode language: JavaScript (javascript)

ファンの動作温度についてはArgonよりも効果のあるCPUクーラーを搭載しファンで空冷もしているので、デフォルトの設定値で良いと思います。

Swapを無効化する

microSDを保護するため、下記コマンドを実行してSwapファイルによる書き込みを抑止します。

$ sudo swapoff --all
$ sudo systemctl stop dphys-swapfile
$ sudo systemctl disable dphys-swapfileCode language: Bash (bash)

設定完了後、下記コマンドを実行してSwapが作成されなくなったことを確認しましょう。

$ free -h
               total        used        free      shared  buff/cache   available
Mem:           7.6Gi       141Mi       7.3Gi       1.0Mi       216Mi       7.4Gi
Swap:             0B          0B          0BCode language: Bash (bash)

ログ出力先をRAMに変更する

microSDへの書き込みを減らすために/var/logへの書き込み先をRAMに変更するlog2ramをインストールします。

$ wget https://github.com/azlux/log2ram/archive/master.tar.gz -O log2ram.tar.gz
$ tar xf log2ram.tar.gz
$ cd log2ram-master
$ sudo ./install.shCode language: JavaScript (javascript)

インストールが完了したらResberry Piを再起動し、dfコマンドでlog2ramが動作していることを確認しましょう。

$ df
Filesystem      1K-blocks     Used  Available Use% Mounted on
...
log2ram            131072    14632     116440  12% /var/log
...Code language: Bash (bash)

※’sudo apt install log2ram’でインストールする手順が各種サイトで紹介されていますが、Rasberry Pi Lite(64bit)では起動時にエラーが出て動作しないため、上記手順でインストールする必要があります。

HDD/SSDをセットアップする

ここではSSD/HDDをフォーマットして読み書きができるようにします。バックアップ・入れ替え時の手間・運用時の柔軟性の観点から、セットアップは1パーティション構成としています。

HDD/SSDを接続してOSが認識できることを確認する

まず外付けストレージをUSBで接続します。次に下記コマンドを実行して、RasberryPi OS上からHDD/SSDが見えていることを確認します。

$ sudo fdisk -l
...
Disk /dev/sda: 931.51 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: MQ01ABD100      
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
... 

もし接続したHDD/SSDが表示されていない場合は、接続に問題がない、故障していないかなどを確認し、正しく表示されるようにする必要があります。

HDD/SSDの既存のパーティションを削除する

すでに作成されているパーティションがある場合は'fdisk -l'コマンド実行時に下記のように/dev/sda1~のように追加情報が表示されます。

$ sudo fdisk -l
...
Disk /dev/sda: 931.51 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: TOSHIBA MQ01ABD1
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: 0xd940675f

Device     Boot      Start        End    Sectors   Size Id Type
/dev/sda1             2048 1048578047 1048576000   500G 83 Linux
/dev/sda2       1048578048 1953525167  904947120 431.5G 83 Linux
...

この場合は下記のようにfdiskでdコマンドを実行して既存のパーティションを削除します。

$ sudo fdisk /dev/sda

Welcome to fdisk (util-linux 2.36.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Command (m for help): d
Partition number (1,2, default 2): 1

Partition 1 has been deleted.

Command (m for help): d
Selected partition 2
Partition 2 has been deleted.

Command (m for help): w

The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.Code language: JavaScript (javascript)

HDD/SSDのパーティションを作成する

下記コマンドを実行してHDD/SSDをフォーマットします。一旦運用が始まるとパーティションのサイズの調整はできないのでパーティションは切らずHDD/SSD全体を1パーティションとします。

$ sudo fdisk /dev/sda

Welcome to fdisk (util-linux 2.36.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 
First sector (2048-1953525167, default 2048): 2048
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-1953523120, default 1953523120): 1953523120       

Created a new partition 1 of type 'Linux' and of size 931.5 GiB.
Partition #1 contains a ext4 signature.

Command (m for help): w
The partition table has been altered.Code language: PHP (php)

wコマンド実行時に実際にパーティションが作成されます。実行後にfdiskコマンドでパーティションができたかを確認します。

$ sudo fdisk -l /dev/sda
Disk /dev/sda: 931.51 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: TOSHIBA MQ01ABD1
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: 0xa615109d

Device     Boot     Start        End    Sectors   Size Id Type
/dev/sda1            2048 1953523120 1953523120 931.5G 83 Linux

作成したパーティションをフォーマットする

下記コマンドでHDD/SDDをext4でフォーマットします。/dev/sda1の部分はフォーマット対象のHDD/SSDのデバイス名に置き換えて実行します。コマンド実行時に確認メッセージは表示されないため、デバイス名を間違えないように気をつけましょう。フォーマットは10秒程度で完了します。

$ sudo mkfs.ext4 /dev/sda1
mke2fs 1.46.2 (28-Feb-2021)
Creating filesystem with 13107200 4k blocks and 3276800 inodes
Filesystem UUID: 7e24b26f-0e1e-41fb-8812-b5a7522c592d
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000, 7962624, 11239424

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (65536 blocks): done
Writing superblocks and filesystem accounting information: doneCode language: JavaScript (javascript)

HDD/SSDを自動マウントする

/etc/fstabを編集し、再起動時に’/mnt/tv-recorderにHDD/SSDをマウントするように設定します。

まず、下記コマンドでマウントポイントを作成します。

$ sudo mkdir -p /mnt/tv-recorder
$ sudo chmod 777 /mnt/tv-recorder
$ sudo chown -R tv-recorder:tv-recorder /mnt/tv-recorder

/etc/fstab で起動時にマウントさせるため、HDD/SSDのパーティションのID(PARTUUID)を調べます。

$ sudo blkid
...
/dev/sda1: UUID="61cc9c24-b882-9949-88c8-88eab12b1ce5" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="432802cd-a1c7-ab4c-aeee-10bdddde3212"
......Code language: JavaScript (javascript)

/etc/fstabにエントリを追加します。
※パーティションを作成せず、HDD/SSD全体を1パーティションとした場合はPARTUUIDがありません。この場合はUUID=…でデバイスを指定すること。

$ sudo vi /etc/fstab
---
proc            /proc           proc    defaults          0       0
PARTUUID=47e8465b-01  /boot           vfat    defaults          0       2
PARTUUID=47e8465b-02  /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that
PARTUUID=61cc9c24-b882-9949-88c8-88eab12b1ce5 /mnt/tv-recorder  ext4 defaults,nofail 0 0Code language: PHP (php)

再起動して自動マウントされることを確認します。

$ df
Filesystem     1K-blocks      Used Available Use% Mounted on
...
/dev/sda1      960302824 297730032 613718332   1% /mnt/tv-recorder/backup
...Code language: JavaScript (javascript)

自動マウントされていることが確認できたら'touch /recorded/testfile'コマンドでファイルが書けるかを確認しましょう。

Sambaサーバーをインストールする

Windows PCから録画ファイルを読めるように、sambaをインストールします。操作ミスで録画ファイルを消さないようにread onlyをyesにしておき、ファイル操作は全てEPG stationからでしかできないようにします。

$ sudo apt install samba samba-common-bin

$ sudo smbpasswd -a media-player

/etc/samba/smb.confに以下を追加します。

$ sudo vi /etc/samba/smb.conf
---
...
[recorded]
path = /mnt/tv-recorder/
public = yes
guest ok = yes
read only = yes
force user = tv-recorder
comment=EPG stationCode language: JavaScript (javascript)

smb.confを書き換えた場合は下記コマンドでsambaサーバーを再起動する必要があります。

$ sudo systemctl restart smbd

再起動したら他のPCからRasberry Piのrecordedフォルダにアクセスできることを確認します。

カードリーダー/TVチューナーをセットアップする

カードリーダーを接続する

RasberryPi上のUSB2.0ポートに接続します。カードリーダーはUSB1.0として認識されるため、USB 3.0ポートへの接続は無意味です。

ドライバのインストールと動作確認はEPG Stationのインストール時に行うため、ここでは接続のみで作業完了です。

TVチューナーを接続する

RasberryPi上のUSB2.0ポートに接続します。TVチューナーはUSB 2.0として認識されるため、USB3.0ポートへの接続は無意味です。

なお、PX-U1DXはRasberryPiに20W電源を接続している場合、バスパワーで問題なく動作することを確認しているため、TVチューナーに付属している電源を接続する必要はありません。

また、電源を接続しているとチューナー側からUSBポートを通して電力が供給されるため、再起動時に接続されたハードウェアが完全にリセットされる保証がなく、トラブル時の原因の切り分けが難しくなりますので、電源は外しておいた方が無難です。

※電源無しで動作することは公式に保証しておらず、動作確認で問題がないことを確認しているだけですので、動作不安定な場合には電源を接続して、問題が改善するかどうか確認しましょう。

PX-Q1UDのドライバはRasberryOSにデフォルトでインストールされており、接続した直後からPX-S1UDが4つとして認識されていますが、このドライバでは起動時にファイル不足のエラーが吐かれていることがdmesgで確認できEPGデータも取得できないことを確認しているので、下記コマンドを実行して公式サイトにあるドライバをインストールします。

$ wget http://plex-net.co.jp/plex/px-s1ud/PX-S1UD_driver_Ver.1.0.1.zip
$ unzip PX-S1UD_driver_Ver.1.0.1.zip
$ sudo cp PX-S1UD_driver_Ver.1.0.1/x64/amd64/isdbt_rio.inp /lib/firmware/Code language: JavaScript (javascript)

ドライバインストール後にPX-S1UDを接続したままRasberry Piを再起動し、下記コマンドを実行してPX-Q1UDが認識されていることを確認しましょう。

$ dmesg | grep PX-
[ 2.792753] usb 1-1.2.1: Product: PX-S1UD Digital TV Tuner
[ 2.980706] usb 1-1.2.2: Product: PX-S1UD Digital TV Tuner
[ 3.164841] usb 1-1.2.3: Product: PX-S1UD Digital TV Tuner
[ 3.348650] usb 1-1.2.4: Product: PX-S1UD Digital TV Tuner
$ ls -al /dev/dvb*
total 0
drwxr-xr-x  6 root root  120 Sep 30 01:47 .
drwxr-xr-x 18 root root 4220 Sep 30 01:47 ..
drwxr-xr-x  2 root root  100 Sep 30 01:47 adapter0
drwxr-xr-x  2 root root  100 Sep 30 01:47 adapter1
drwxr-xr-x  2 root root  100 Sep 30 01:47 adapter2
drwxr-xr-x  2 root root  100 Sep 30 01:47 adapter3

TVチューナーが認識されていない場合は、ディスプレイを繋いでTVチューナー接続時にエラーが出ていないか確認しましょう。エラーが出ている場合はリブートすると治ることがあります。

Docker版mirakurun-epgstationをインストールする

現時点でメンテナンスが継続されていて、かつI/Fが最も洗練されているのはEPG stationです。現在Docker版でメンテナンスが進んでいることと、インストールが簡単であることからDocker版のEPG stationをインストールします。

Docker, Docker-composeをインストールする

まず下記コマンドを実行して、docker,docker-composeをインストールします

$ sudo apt install -y docker docker-compose

Docker版EPG Stationをインストールする

次に下記コマンドでEPG stationをインストールします。ダウンロード速度にもよりますが、コマンド実行完了まで3分程度かかるのでのんびり待ちましょう。

$ cd ~
$ curl -sf https://raw.githubusercontent.com/l3tnun/docker-mirakurun-epgstation/v2/setup.sh | sudo sh -s
$ sudo chown -R tv-recorder:tv-recorder docker-mirakurun-epgstation
$ cd docker-mirakurun-epgstationCode language: JavaScript (javascript)

※この時点で編集済みのdocker-compose.yml,epgstation/config/config.ymlがある場合はコピーをしておくことで復旧の手間を省くことができます

下記コマンドを実行してMirakurun/EPG Stataionを起動します。初回起動時はビルドが走り、起動完了まで20分程度かかるのでのんびり待ちましょう。

$ sudo docker-compose up -d

インストール完了後、ブラウザから'http://<IP Address>:40772/'にアクセスしてMirakrunのHPが表示され、'http://<IP Address>:8888/'にアクセスしてEPG Stationが表示されることを確認します。

B-CASカードが認識できることを確認する

この過程でカードリーダーのドライバもインストールされるため、EPG stationが起動したあとにカードリーダーが正しく認識されているかどうかをlsusbコマンドで確認します。

$ lsusb
...
Bus 001 Device 003: ID 04e6:5116 SCM Microsystems, Inc. SCR331-LC1 / SCR3310 SmartCard Reader
...

次にB-CASカードをカードリーダーに差し込み、LEDが点灯することを確認します。

LEDが点灯しない場合は、カードリーダが正しく動作しておらず、LEDが点滅している場合はカードが正しく認識されていないことになるので、カードの裏表を逆にして挿入して動作するかどうかと、カードリーダー/B-CASカードに問題がないかを確認します。

チャンネルスキャンをする

下記コマンドを実行してチャンネルスキャンを実行します。スキャンは10分程度で完了します。

$ curl -X PUT "http://localhost:40772/api/config/channels/scan"Code language: JavaScript (javascript)

実行しなくてもEPG stationで番組が表示されますが、一部チャンネル(TOKYO MXなど)が表示されないことがあること、再取得処理が延々と続きプロセスを圧迫することがあり、録画が突然停止することもあるため、未実施の場合は必ず実行しましょう。

Docker版mirakurun-epgstationを設定する

ここではdocker-compose.ymlとepgstation/config/config.ymlを編集して、ディスク構成や録画ファイルを設定します。この2つのymlは一度設定後にバックアップをとっておくことで次回の設定の手間を省くことができます。

録画データを分類するためのフォルダを作成する

録画データの分類用フォルダは以下のように設定しました。

  • ‘delete’ -> 期限が来たら削除する(ニュース・バラエティ番組など)
  • ‘keep’ -> ずっと残す(ドキュメンタリー・映画・アニメなど)

さらにSDデータのbackup用のフォルダも用意します。

$ sudo mkdir -p /mnt/tv-recorder/backup /mnt/tv-recorder/delete /mnt/tv-recorder/on_hold /mnt/tv-recorder/keep 
$ sudo chmod -R 777 /mnt/tv-recorder
$ sudo chown -R tv-recorder:tv-recorder /mnt/tv-recorderCode language: JavaScript (javascript)

Dockerから’/mnt/tv-recorder/backup’,’/mnt/tv-recorder/keep’,’/mnt/tv-recorder/delete’にアクセスできるように設定する

録画ファイルの保存先として’/mnt/tv-recorder/keep’と’/mnt/tv-recorder/delete’を指定できるようにdocker-conpose.ymlを修正します。

$ cd ~
$ vi docker-mirakurun-epgstation/docker-compose.yml
---
services:
    ...
    epgstation:
        ...
        volumes:
            ...
(修正前)    
            - ./recorded:/app/recorded
(修正後)    
           - /mnt/tv-recorder/backup:/app/backup
           - /mnt/tv-recorder/tentative:/app/delete
           - /mnt/tv-recorder/recorded:/app/keepCode language: JavaScript (javascript)

設定が完了したらdockerを再起動し、dockerコンテナから/mnt/tv-recorder以下にマウントしたbackup,recorded,tentativeディレクトリにアクセスできるようになったことを確認します。docker inspectコマンドで指定するContainer IDは起動ごとに動的に変化するため、psコマンドで確認する必要があります。
※再起動時はrestartではなく down&upで行わないと設定が反映されないため注意すること

$ cd ~/docker-mirakurun-epgstation
$ sudo docker-compose down 
$ sudo docker-compose up -d
$ sudo docker ps -a
CONTAINER ID   IMAGE                                    COMMAND                  CREATED       STATUS        PORTS                                              NAMES
562d4973e9d5   docker-mirakurun-epgstation_epgstation   "npm start"              10 days ago   Up 35 hours   0.0.0.0:8888-8889->8888-8889/tcp                   docker-mirakurun-epgstation_epgstation_1
dd8371eb9ce9   chinachu/mirakurun                       "docker-entrypoint.s…"   10 days ago   Up 36 hours   0.0.0.0:9229->9229/tcp, 0.0.0.0:40772->40772/tcp   docker-mirakurun-epgstation_mirakurun_1
d6b9da403421   mariadb:10.5                             "docker-entrypoint.s…"   10 days ago   Up 36 hours   3306/tcp                                           docker-mirakurun-epgstation_mysql_1
$ sudo docker inspect 562d4973e9d5
...
           {
                "Type": "bind",
                "Source": "/mnt/tv-recorder/delete",
                "Destination": "/app/delete",
                "Mode": "rw",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "bind",
                "Source": "/mnt/tv-recorder/keep",
                "Destination": "/app/keep",
                "Mode": "rw",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "bind",
                "Source": "/mnt/tv-recorder/backup",
                "Destination": "/app/backup",
                "Mode": "rw",
                "RW": true,
                "Propagation": "rprivate"
            },
  ...Code language: PHP (php)

録画ファイルの保存パスとデフォルト録画ファイル名を変更する

まず、ファイル名を'YYYYMMDD_HHMM <番組名>'に変更します。

$ cd ~
$ vi docker-mirakurun-epgstation/epgstation/config/config.yml
---
...
(修正前)
recordedFormat: '%YEAR%年%MONTH%月%DAY%日%HOUR%時%MIN%分%SEC%秒-%TITLE%'
(修正後)
recordedFormat: '%YEAR%%MONTH%%DAY%_%HALF_WIDTH_TITLE%'
...Code language: JavaScript (javascript)

さらに録画データの保存先を’自動削除する'(delete)、’とりあえず録っておく'(on_hold)’、’保存する'(keep)で指定できるように、下記のように変更します。

設定ではHDDの容量が50GBを切った場合に、自動で古いものからファイルを削除するようにしています。EPG stationは保存先によらず単純に古い録画データから消していく仕様のようなので、削除開始の閾値は全て同じにする方が動作がわかりやすくなります。

$ cd ~
$ vi docker-mirakurun-epgstation/epgstation/config/config.yml
---
...
recorded:
(修正前)
    - name: recorded
      path: '%ROOT%/recorded'
(修正後)
    - name: '自動削除する'
      path: '%ROOT%/delete'
      limitThreshold: 50000
      action : remove
    - name: '保存する'
      path: '%ROOT%/keep'
      limitThreshold: 50000
      action : removeCode language: JavaScript (javascript)

容量が足りなくなる前に常に手動で消す方法でもいいですが、削除する量が足りない、削除忘れなどのヒューマンエラーで容量不足になるリスクがあることから、自動削除で対応する方が良いかと思います。保存期間を長くしたい場合はHDD/SSDの容量を大きくすればいいだけですので対応も簡単です。

修正後にEPGStationを再起動し、EPGStationのメニューの’ストレージ’を選択して保存先が正しく認識され、録画可能な容量がHDDサイズになっていることを確認します。

$ cd ~/docker-mirakurun-epgstation
$ sudo docker-compose restart

録画データの所有者IDをtv-recorderに変更する

デフォルトの録画ファイルの所有者はrootになっており、sudoで実行しないと録画ファイルの移動や削除ができません。この手間を解消するため、ファイルの所有者がtv-recorderになるようにconfig.ymlに’uid: 1000′(1000はtv-redcorderのUID)を追加します。

$ cd ~
$ vi docker-mirakurun-epgstation/epgstation/config/config.yml
---
...
uid: 1000
gid: 1000
...Code language: Bash (bash)

再起動時にEPG stationが起動しない問題への対応

上記機材と手順でセットアップを完了させるとReboot後にEPG stationが表示されない問題があります。起動直後のプロセスを確認するとMirakrunが起動していないことがわかります。

 $ ps -ax | grep docker-proxy
   1410 ?        Sl     0:00 /usr/sbin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 9229 -container-ip 172.18.0.2 -container-port 9229
   1916 ?        Sl     0:00 /usr/sbin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8889 -container-ip 172.18.0.3 -container-port 8889
   1931 ?        Sl     0:00 /usr/sbin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8888 -container-ip 172.18.0.3 -container-port 8888
   2283 pts/0    S+     0:00 grep --color=auto docker-proxyCode language: Bash (bash)

Mirakurunが動作している場合は下記のプロセスが表示されますが、これがありません。

   1397 ?        Sl     0:00 /usr/sbin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 40772 -container-ip 172.18.0.2 -container-port 40772Code language: Bash (bash)

原因として電源ON時の突入電力不足を疑いましたが、RasberryPiを100Wの充電器に接続してもTVチューナーに電源を直接接続してもこの現象が発生することから電力不足ではないことまでは確認済みです。原因は現時点では不明です。

OS起動後にsshログインして手動で再起動はできるので、systemdを利用してOS起動後に遅延処理を実行してdockerを再スタートするように設定を追加して対応します。

再起動用のスクリプトを書く

まず下記スクリプトを作成して/home/tv-recorderに置きます。chmod 777で実行権限を付与し、再起動処理が正しく動作することを確認します。

#!/bin/bash
pushd /home/tv-recorder/docker-mirakurun-epgstation
sudo docker-compose restart
popd

OS起動後に再起動処理を実行するように設定する

遅延実行にはsystemdを利用します。まずepgstation.serviceとepgstation.timerファイルを下記手順で作成します。

$ sudo vi /etc/systemd/system/epgstation.service
---
[Unit]
Description=Restart EPG station
[Service]
ExecStart=/home/tv-recorder/restart_epgstation.sh
[Install]
WantedBy=multi-user.target
---Code language: Bash (bash)
$ sudo vi /etc/systemd/system/epgstation.timer
---
[Unit]
Description=EPG station restart timer
[Timer]
OnBootSec=30sec
Unit=epgstation.service
[Install]
WantedBy=multi-user.target
---Code language: Bash (bash)

待ち時間は20秒ではdockerのリスタートされず、30秒で安定してリスタートがかかったことから30秒に設定しています。

次に下記コマンドを実行してepgstation.timerをsystemdに登録します。

$ sudo systemctl enable epgstation.timer

上記設定が完了したらRasberryPiを再起動して、EPG stationが正しく起動することを確認してください。

再生環境セットアップ

ここではオフィシャルサイトで設定例として紹介されているVLCを使います。必要に応じて再生方法を自分で変更してください。

Windows

録画データの一覧と再生には、Sambaで表示されるm2tsを直接ダブルクリックしてVLCで再生されるようにデフォルトアプリを設定する方法が一番簡単で確実です。

リアルタイム視聴は視聴時にダウンロードされる.m3u8ファイルをVLCに割り当てて、ファイルをダブルクリックして視聴を開始する方法が簡単です。

個人的にはインターフェースがシンプルなMPC-BE(Media Player Classic-Black Edition)がおすすめです。

Mac

録画データの一覧と再生には、Sambaで表示されるm2tsを直接ダブルクリックしてVLCで再生されるようにデフォルトアプリを設定する方法が一番簡単で確実です。

リアルタイム視聴は視聴時にダウンロードされる.m3u8ファイルをVLCに割り当てて、ファイルをダブルクリックして視聴を開始する方法が簡単です。

iOS

録画データの一覧と再生には、infuseを使うのが一番手間がかからないです。

リアルタイム視聴はVLCをインストールした後に”設定-放映中-視聴 URL Scheme”に以下を入力すればいいです。
vlc://PROTOCOL://ADDRESS

Android

VLCをインストールするだけで、EPG Stationから番組視聴ができます。

TV/プロジェクター

Google Chromecastを繋げてPlexやKodiをインストールし、smb経由でm2tsを参照することでTV視聴することができます。

動作確認

まず再起動したあとにdmesgコマンドで表示されるカーネルログで致命的なエラーが出力されていないかを確認しましょう。私の環境ではエラーは出力されませんでした。

次に、30分程度電源を入れっぱなしにして放置したあとにEPG stationの番組表を表示し、利用するすべてのチャンネルの番組表が表示されていることを確認しましょう。表示されない場合はアンテナ接続やMirakurunの動作(http://<IP address>:40772)などを確認しましょう。

次にEPG stationから4番組同時録画を1時間程度実行し、録画データをVLCで再生してみてノイズがないことを確認しましょう。

あとは継続使用をしてトラブルに見舞われたら随時対応と対策を打つようにします。

トラブルシュートの欄に記載した電波強度とエラーブロックの発生状況を知るツールをあらかじめ用意しておくと、ブロックノイズ発生時に原因の特定がスムースに行えます。

リモート視聴

録画サーバに過度な負荷を与えないように視聴用のサーバーを別に立てて、そちらにファイルをコピーしPlexを介してリモート視聴するようにしています。(詳細は後日別コンテンツとしてアップ予定)

録画データのバックアップとmp4への変換

下記に別記事としてまとめましたので、こちらを参照してください。

microSDカードとEPG stationのデータのバックアップとリストア

microSDカード

microSDカードをRasberry PiのOSディスクにしていると、microSDのイメージファイルを作ることで全く同じOSディスクを複製できます。OSのイメージファイルさえ持っていれば、設定の変更によりレコーダーの動作が安定しない状態に陥っても、イメージファイルからmicroSDカードを複製して入れ替えれば完全に元通りにすることができます。

イメージ作成はddコマンドでできますが、使用している容量にかかわらずmicroSDのサイズ分のイメージデータができてしまいます。すなわち64GBのmicroSDを使用している場合は、実際に使用している容量にかかわらず64GBのイメージが出来上がります。

このサイズを縮小するために以下のサイトにあるスクリプトを利用させてもらっています。
https://dev.classmethod.jp/articles/raspberrypi-compress-backup/

このスクリプトはRasberry Pi OS DesktopでユーザーIDがpiに設定されている環境で正常に動作するので、ログインユーザー名が違う場合は下記のハイライト部分を修正する必要があります。

吸い出したSDカードイメージはRasberry Piの/mnt/tv-recorder/backup領域に保存しておき、SDカードが壊れた時にここからイメージファイルを取り出して、SDカードをすぐに復旧できるようにしておきましょう。

イメージファイルをmicroSDへ書き出す際には下記のツールを利用しています。

https://github.com/dnobori/DN-Win32DiskImagerRenewal

EPG stationのデータ(録画データのメタ情報、サムネイル、録画予約など)

/mnt/tv-recorder/backupフォルダに下記のスクリプトを作成し、’chmod 777 backup.sh’で実行権限をつけて、バックアップできることを確認します。下記スクリプトはEPG stationのデータの他に、homeディレクトリと/etc以下の編集したファイルをバックアップする処理を追してあります。

#!/bin/bash

function set_attribute()
{
	sudo mkdir -p     $1
	sudo chmod -R a+r $1
	sudo chmod -R a+w $1
	sudo chown tv-recorder:tv-recorder $1
}

record_dir=/mnt/tv-recorder
backup_dir=${record_dir}/backup

#create record directory
set_attribute ${record_dir}/keep
sudo touch ${record_dir}/keep/.keep
set_attribute ${record_dir}/on_hold
sudo touch ${record_dir}/on_hold/.keep
set_attribute ${record_dir}/delete
sudo touch ${record_dir}/delete/.keep

#create backup directory
set_attribute ${record_dir}/backup
set_attribute ${record_dir}/backup/epgstation
set_attribute ${record_dir}/backup/etc
set_attribute ${record_dir}/backup/home

# Delete empty directory
find ${record_dir}/keep/    -type d -empty -exec sudo rm -rf {} \;
find ${record_dir}/on_hold/ -type d -empty -exec sudo rm -rf {} \;
find ${record_dir}/delete/  -type d -empty -exec sudo rm -rf {} \;

#backup epgstation
pushd ${backup_dir}/epgstation
	sudo cp -rf database_backup database_backup_old
	sudo docker exec docker-mirakurun-epgstation_epgstation_1 npm run backup /app/backup/epgstation/database_backup
	set_attribute ./docker-mirakurun-epgstation/epgstation/thumbnail
	cp ~/docker-mirakurun-epgstation/epgstation/thumbnail/* ./docker-mirakurun-epgstation/epgstation/thumbnail/
	set_attribute ./docker-mirakurun-epgstation/epgstation/config
	cp ~/docker-mirakurun-epgstation/epgstation/config/config.yml ./docker-mirakurun-epgstation/epgstation/config/
	cp ~/docker-mirakurun-epgstation/docker-compose.yml ./docker-mirakurun-epgstation/
popd

#backup etc
pushd ${backup_dir}/etc
	cp /etc/fstab .
	mkdir -p samba
	cp /etc/samba/smb.conf samba/
	mkdir -p systemd/system
	cp /etc/systemd/system/epgstation.* systemd/system/
popd

#backup home
sudo rsync -aP --delete /home/tv-recorder/ ${backup_dir}/home/

次に録画処理が発生することがほぼないであろう夜中の2時にバックアップ処理が走るように、crontab -eで下記エントリを追加します。

0 2 * * * cd /mnt/tv-recorder/backup/ && ./backup.sh -e

OS再インストール時などでEPG stationを再構築した時は、下記コマンドを実行してbackupファイルからリストアできます。

$ sudo docker exec docker-mirakurun-epgstation_epgstation_1 npm run restore /app/backup/epgstation/database_backup
$ cp /mnt/tv-recorder/backup/docker-mirakurun-epgstation/epgstation/thumbnail/* ~/docker-mirakurun-epgstation/epgstation/thumbnail/ 

録画データ

録画データは前述の変換スクリプトでWindows PCにバックアップされます。

Tips & Troubleshooting

ここでは、初めてRasberryPiで録画サーバーをセットアップしたときに躓いたところや、動作確認の際に調べたことをメモしておきます。

停電復帰時に自動で再起動しない

DeskPiとArgon ONEは停電などで一度電源が落ちると電源が復旧しても電源ボタンを押すまでRasberryPiには電源が供給されません。このため、一旦停電が発生すると手動で電源をONするまで、録画が止まってしまいます。

DeskPiとArgon ONEは常時通電設定もできますので、停電対策には常時通電状態に設定を変更します。

ただし、電源ボタンによるRasberryPiの電源ON/OFFができなくなるので、強制リセットなどで電源を一旦切る場合は電源を物理的に切断する必要があります。

同時録画ができない

Mirakurunのページを開いて、下記のPidの数値が上がっている場合は録画開始時に録画プロセスが死んでおり、RasberryPiへの電源供給が足りていません。20W以上の供給能力を持つ充電アダプタをつけましょう。

CrontabでEPG stationのデータだけがバックアップできない

バックアップスクリプトを手動で実行した場合はバックアップできるにもかかわらず、Crontabで動作させるとdocker内のEPG stationのデータだけがバックアップされない場合があります。

この場合はdocker execコマンドに-itオプションがついているので、-itオプションを削除して対応します。

(正) $ sudo docker exec -it docker-mirakurun-epgstation_epgstation_1 npm run backup /app/recorded/_backup/epgstation_database_backup
(誤) $ sudo docker exec     docker-mirakurun-epgstation_epgstation_1 npm run backup /app/recorded/_backup/epgstation_database_backup

EPGは取得できるがTV放送が表示されない

B-CASカードがきちんと挿さっていない場合に発生します。再生状態でカードリーダーのLEDが動作中を示しているか確認し、点灯していない場合は挿入し直しましょう。

トラブル解析時にEPG stationのLogを見たい

下記コマンドでログのリアルタイム出力を確認できます。

$ sudo docker-compose logs -f mirakurun
$ sudo docker-compose logs -f mysql
$ sudo docker-compose logs -f epgstation

プロセスは起動しているがEPG stationが表示されない

現時点で原因・対処方法ともに不明です。この現象発生時にセットアップ時の確認事項を確認したところ、カードリーダーが正しく認識しているにもかかわらず、B-CASカードリーダーのLEDが点灯しません。このことからUSB関連の何かでトラブルがあったものと思われます。

時間をおいて再起動すると直ります。

録画ファイルのWindowsへの転送速度が極端に遅くなる

共有フォルダからWindowsへファイルをダウンロードしたときに10Mb/s程度しか出なくなることがあります。通常は50〜80MB/s程度ですので、GB級のダウンロード時はかなりの差がでます。

HDDの転送速度の低下、CPUのオーバーロード、Sambaサーバーのバグなどを疑ってみましたが、これらに問題はありませんでした。

そこで、SpeedTest CLIで外部とのネットワークの転送速度をしたところ、起動直後は400MB/sでていたものが時間が経過すると50MB/s以下に低下することを確認しています。他のRasberry Piではこのような現象は発生していないことから、Rasberry Piとハブとの間に問題があると推測し、Etherケーブルを太いものに取り替えたところ現象が発生しなくなりました。

直接の原因は不明ですが、Rasberry Piをサーバーとして使う場合はノイズ耐性の高い太いEtherケーブルで接続するのが無難なようです。

電波強度が安定しているにも関わらずブロックノイズが乗る場合がある

チューナーの電波利得がデバイスID・チャンネルごとに異なるため、電波利得の悪いデバイス・チャンネルで録画処理をすると発生します。

私の場合、しばらく運用を続けていると、NHK Eテレを録画したときに番組を通して盛大なノイズが乗ることがありました。ただし、常にノイズが乗るわけではなく、ノイズが乗る時は最初から最後まで乗り続けます。また、ノイズが乗っている最中に再起動するとノイズがなり、同時に視聴していてもノイズが乗らないという状態でしばらく原因がわかりませんでした。

ただ、同じチャンネルを続けて録画すると後番組でノイズが突然発生し、そのまま最後までノイズが乗り続けることがわかり、このことからチューナーによってノイズが乗る場合があると推測が立ちました。

そこで、チューナーごとにエラーブロックの発生量を調べるとデバイス0にあたるチューナーのみがエラーブロックを出力することがわかりました。そこでMirakurunのconfigで、デバイス0のチューナーをOFFにして使用しないようにして対処しました。

この場合、3チャンネルまでしか同時録画ができなくなりますが、ノイズありの番組を録画をしないためには致し方なく、実運用上3チャンネル同時録画で十分用を成すのでOFFとしました。

なお、ブロックノイズが乗る原因には電波強度が弱すぎる・強すぎるというものもあります。そこで原因を切り分けするためにこちらのサイトを参考にしました。具体的には以下の手順で確認します。

まず、チューナーとチャンネルを指定してエラーブロックの数と電波強度を出力するバイナリをコンパイルします。

$ git clone https://github.com/jsasky/recdvb.git
...
$ sudo apt-get update
$ sudo apt-get install -y --no-install-recommends ca-certificates gcc g++ build-essential libtool autoconf automake cmake make
...
$ cd recdvb
$ chmod +x autogen.sh
$ ./autogen.sh
...
$ ./configure
...
$ make
...

次に下記コマンドとパラメータでノイズの乗っているチャンネルとチューナーを指定してエラーブロックの有無と信号強度を確認します。

$ ./chkdvbsignal --lnb 15 26 --dev 0
LNB = 15V
device = /dev/dvb/adapter0/frontend0
Using DVB device "Siano Mobile Digital MDTV Receiver"
tuning to 551.143 MHz
..ok(0x1F)
CNR: 16.00000[dB]  Error:  10621[counts]  Total:  26560[counts]  SIG: -28.00000[dBm]

チャンネルは以下の通りです。–devで指定する数値がチューナー番号になります。–lnbは15固定です。これで電波強度を調整したあと、エラーブロックの発生するチャンネルとチューナーを特定します。

20ch: Tokyo MX TV
21ch: フジテレビ
22ch: TBS
23ch: テレビ東
24ch: テレビ朝日
25ch: 日テレ
26ch: NHK Eテレ
27ch: NHK総合
28ch: 放送大学Code language: HTTP (http)

アッテネータを駆使して調べたところ、信号強度は-40〜-35dBm程度であればエラーブロックが発生しないようです。信号強度が範囲外の場合はアッテネーターやブースターを使用して適切な電波強度になるようにします。

録画後数分経つと録画が停止してしまう

USBからの電源供給で動作するHDD/SSDを接続している場合に発生します。

データを記録中にピーク電流が発生したとき、動作電力が足りず強制的にUSBが抜かれた状態になるために発生するようです。電力消費が少ないSSDであってもこの現象は発生します。外部電源で動作するストレージを利用しましょう。

なお、DeskPiProは内部で電源が別扱いになっているため、内蔵のHDD/SDDに記録していても問題なく動作します。

以上、参考になれば幸いです。