Raspberry Pi 3+Chinachuで地デジ録画サーバー構築

##そもそも録画サーバーとは
コンピュータと地デジアンテナをチューナーを通して接続し、HDDにテレビ番組を保存することができるサーバーのこと。テレビと同じように番組表を見て録画を予約したり、条件に当てはまる番組を自動録画できたりする。録画したファイルは、複製したりmp4に変換することもできる。
![Kobito.qCkNjG.png](https://qiita-image-store.s3.amazonaws.com/0/190719/1d596a89-c295-ded6-b090-7f6c82d79785.png "Kobito.qCkNjG.png")




さらにローカルネットワーク経由でMacやiPhone,FireTVから**テレビ番組のリアルタイムストリーミング視聴**も可能。画質は体感でYoutubeの1080Pと同じくらい、遅延も2秒ほど。




##今回使ったもの
###Raspberry Pi Model B
約5780円
>廉価なLinux PCとして。

https://www.amazon.co.jp/gp/product/B01CSFZ4JG/
###PLEX USB接続ドングル型地上デジタルTVチューナー PX-S1UD V2.0
約4530円
>珍しいUSB式の地デジチューナー。安め。1台で同時に1チャンネルのみの視聴、録画が可能。買い足して同時受信チャンネルが増やせる。

https://www.amazon.co.jp/gp/product/B0141NFWSG/
###SCM ICカードリーダー／ライター B-CAS・住基カード対応 SCR3310/v2.0 【簡易パッケージ品】
約1770円
>B-CASカードの読み取り用。

https://www.amazon.co.jp/gp/product/B0085H4YZC/

###500GBのHDD
>家にあったやつ。

###B-CASカード
>使わなくなったDVDプレイヤーから拝借。

###アンテナ分配器
>リビングのTVと同じ同軸ケーブルからアンテナに接続するため。必須ではない。

※アンテナ分波器と記載していましたが、誤りでした。コメントでご指摘いただいたため、修正しました。

##⚠︎注意
以下の手順に進んだ時点で本項に承諾したものとみなします。
この記事はエンドユーザー向けではありません。
以下の手順は全て自己責任で、何かしらの問題が発生しても自力で対処できる方のみ実行してください。
テレビ番組のコピー、配信は違法となる場合があります。使用についても十分注意して下さい。
この記事を参考にしたことにより生じたあらゆる損害について、著者は一切の責任を負いません。

##Raspberry Piの準備
Raspberry piのOSは標準のraspbian(Linuxベース,32bit,armhf,armv7)をインストールする。


Raspberry Piにディスプレイとキーボード、マウスを繋いでSSHが使える状態まで設定したらMacから`ssh pi@[IPアドレス]`で接続。

しかしこのままではリモートでCUIでしかファイル操作ができず、使いにくい。
そこで、sambaとwebminをインストールする。
sambaは`sudo apt-get install　samba`でインストールできるが、webminは[サーバ](http://webmin.com/download.html)ーから最新版を`wget`して展開、インストールしなければならず多少面倒。

webminのインストールが完了すると、ローカルネットワーク経由でブラウザからwebminの画面を開くことができる。URLは

```
https://[IPアドレス]:10000/
```
これによって、多くの設定がGUIでできるようになった。
![Kobito.XdJS4N.png](https://qiita-image-store.s3.amazonaws.com/0/190719/71c46495-5a6d-713f-f946-40b2ae5f1835.png "Kobito.XdJS4N.png")

ここで、左のメニューからサーバ⇨Samba設定に進むと、Sambaの設定を全てGUIで行うことができるので、ユーザーやパスワード、権限を編集し、Sambaを起動させる。

先ほど設定したユーザ名とパスワードを使うと、MacのFinderからRaspberry Piのファイルシステムにアクセスできるようになる。
![Kobito.Ye9x8H.png](https://qiita-image-store.s3.amazonaws.com/0/190719/4fc34fa0-f43c-283e-8542-3d7959c6e5da.png "Kobito.Ye9x8H.png")

SambaはFTPと違い、root権限でファイルを扱えるようにも設定できる。さらに、Atomなどのエディタで直接ファイルを開いて編集できるので、殆どローカル感覚で作業を進めることが可能。しかも、Raspberry PiにUSB接続されているHDDの中身も編集することができるので、大容量HDDを繋げばメディアサーバーとしても使えるようになる。

この時点でRaspberry Piにディスプレイや、キーボードを繋げる必要がほぼなくなりサーバーとして扱いやすくなった。
##チューナーの準備
チューナーを使うには、ドライバのインストールが必要。

```
$ 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/
```
でインストールできる。
##カードリーダーとB-CASの準備
カードリーダーを使うには、まず関連パッケージのインストールが必要。

```
$ sudo apt-get install build-essential git
$ sudo apt-get install pcscd libpcsclite-dev libccid pcsc-tools
```
でインストールできる。

しかし、今回使ったカードリーダーはpcscdのカードリーダー定義ファイルに型番が含まれていないのでこのままでは認識されない。(ここで2週間くらいつまずいた)
pcscdのカードリーダー定義ファイルは、一見すると`/usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Info.plist`だが、こちらを編集するとpcscdが起動不可になってしまう。
そこで、`/etc/libccid_Info.plist`を編集する。
ここでの作業は今回使ったカードリーダーの型番を定義ファイルに追加することだが、その前に型番を調べる必要がある。

型番を調べるには、カードリーダーをRaspberry Piに接続した状態でコマンド`lsusb`を使う。すると、`Bus 001 Device 006: ID 0409:018b NEC Corp. `と表示された。これは、このカードリーダーのベンダーIDが0409で製品IDが018bであることを示している。(SCM製のものを注文したのにNEC製のものが届いた模様）
ここで`/etc/libccid_Info.plist`の編集に戻ると、定義づけされている全てのカードリーダーのベンダーIDと製品ID、Friendly name(表示名)が列挙されている。この規則に従い、3点入力した上で上書き保存、pcscdの再起動を行うとカードリーダーが認識されるようになる。
認識の確認には、`sudo pcsc_scan`を使う。うまくいくと、B-CASカードが読み込まれている旨が表示される。
##B-CASのデコード用ライブラリのインストール
日本の地デジ放送は暗号化された状態で配信されているため、そのまま受信して保存すると再生や複製の際に問題が起こる。そこで、B-CASカードの情報を使って受信と同時に復号するのが望ましい。これを実現するライブラリがlibarib25だ。
このライブラリをコンパイルする際、`cmake`と`g++`が必要なので`sudo apt-get install cmake g++`でインストールしておく。
ライブラリ自体は、


```
$ wget https://github.com/stz2012/libarib25/archive/master.zip
$ unzip master.zip
$ cd libarib25-master
$ cmake .
$ make
$ sudo make install
```
でインストールできる。
##録画用コマンドのインストール
GUIの録画ソフトを動かす前に、CUIの録画コマンドが必要なので録画コマンドrecdvbをインストールする。


```
$ wget http://www13.plala.or.jp/sat/recdvb/recdvb-1.3.1.tgz
$ tar xvzf recdvb-1.3.1.tgz
$ cd recdvb-1.3.1
$ ./autogen.sh
$ ./configure  --enable-b25
$ make 
$ sudo make install
```
でインストールできる。configureの --enable-b25オプションをつけないと復号を行ってくれない。

この時点で、コマンドでの録画が可能になった。例えば、

```
$ recdvb –-b25 -–strip 24 10 test.m2ts
```
を実行すると物理チャンネル24から10秒間データを受信し、b25ライブラリを使って同時デコードしたものがtest.m2tsというファイルに保存される。しかし、いちいち秒数指定が必要で実用的ではない。なお、ここでいう物理チャンネルについては電波塔ごとに異なり、[こちら](http://www.maspro.co.jp/contact/channel.pdf)から確認することができる。

またこの時点で可能になるのが、ローカルネットワーク経由でのリアルタイムストリーミング配信だ。

```
$ recdvb –-b25 –-strip -–http 8080
```
を実行すると、Raspberry PiのローカルIPアドレスのポート8080番でストリーミング配信の待受がされる。しかし、このまま接続しにいってもエラーが出てしまうので、事前にRaspberry Piの`/etc/hosts`を編集し、視聴デバイスのIPアドレスをホワイトリストとして登録する必要がある。また、m2tsという特殊な拡張子でストリーミングされるので、ブラウザから見ることはできない。そこで、クラスプラットフォームで開発が進んでいるメディアプレイヤー、VLC MediaPlayerを視聴デバイスにインストールする。MacやWindowsの場合[ここ](https://www.videolan.org/vlc/index.ja.html)からダウンロード、インストールできる。

ストリーミング再生をするには、VLCのメニューからファイル⇨ネットワークを開くを選択し、URL欄に

```
http://[IPアドレス]:8080/[物理チャンネル]
```
を入力して開くボタンを押す。もちろん、Raspberry Pi側は配信待ち受け状態でないといけない。また、いちいち物理チャンネルを入力するのが面倒だったらm3u形式のプレイリストを作ることもできるが、のちの工程で別のストリーミング方法を使うことになるのでURLが変わってしまう。

Raspberry Pi側の待ち受け状態を終了するには、`Ctrl+C`でプロセスを中止させるか、webminの実行プロセス欄から強制終了させる。

##チューナーサーバーのインストール
チューナーサーバーを使うと、録画コマンドの並列処理や、複数チューナーの管理(今回は必要ない)、優先度処理が可能になる。また、チューナー自体をローカルネットワークの共有リソースにできるので、SSH無しでも他のPCから録画処理を制御したりできるようになる。
今回使うチューナーサーバーMirakurunでは、apiを使って多くの処理を簡略化できる上、拡張性もかなり高い。(GUIは無い)

Mirakurunはnode.jsベースのシステムなので、node関連のパッケージを事前にインストールする必要がある。公式ではnodeのメジャーバージョン8でも動作することになっているが、動作しなかったのでnode6の最新版をインストールする。(ここでも1週間くらいつまずいた)

```
$ wget https://nodejs.org/dist/v6.11.2/node-v6.11.2-linux-armv7l.tar.xz
$ tar -xvf node-v6.11.2-linux-armv7l.tar.xz
$ cd node-v6.11.2-linux-armv7l
$ sudo cp -R * /usr/local/
```
npmのインストールは`sudo apt-get install npm`で問題なくできる。

node関連パッケージのインストールが終わったら、

```
$ sudo npm install pm2 -g
$ sudo npm install mirakurun -g --unsafe --production
```
でMirakurunをインストールできる。

Mirakurunがインストールされると、`/usr/local/etc/mirakurun`に3つの設定ファイルが生成される。
設定が必要なのは、tuners.ymlとchannels.ymlの2つ。

tuners.ymlでは、チューナーの設定を行う。今回使ったチューナーの設定は、

```
- name: PX-S1UD-1
  types:
    - GR
  command: recdvb --b25 --dev 0 <channel> - -
```
なので末尾に追加する。

channels.ymlでは、電波塔に応じた物理チャンネル番号を登録する。`curl -X PUT "http://localhost:40772/api/config/channels/scan`を使うと時間がかかるが自動で登録ができる。

これでMirakurunの設定が完了したので`mirakurun start`でMirakuranを起動する。問題なければ`mirakurun status`にonlineと表示される。

実はこれで、recdvbでいちいちコマンドを打たなくてもローカルネットワーク経由でのリアルタイムストリーミング配信ができるようになる。
視聴方法はrecdvbと変わらないが、URLが

```
http://[IPアドレス]:40772/api/channels/GR/[物理チャンネル]/stream
```
に変更される。Mirakurunが一枚噛むことになるが、安定性はほぼ変わらない。
##録画サーバーのインストール
録画サーバーを使うと初めてGUIを使った番組表からの録画ができるようになる。そこで地上デジタル波から随時最新の番組表データを取得でき、またタイマー録画にも対応するChinachuをインストールする。
事前に、必要なパッケージをインストールする。

```
$ sudo apt-get install build-essential curl git-core vainfo
```
完了したら、Chinachuをインストールする。

```
$ cd
$ git clone git://github.com/kanreisa/Chinachu.git ~/chinachu
$ cd ~/chinachu/
$ ./chinachu installer
```
インストールオプションが表示されるので、Autoを選択する。
インストールが完了したら、

```
$ cp config.sample.json config.json
```
でconfigファイルを生成しておく。何もいじらなくても問題ないが、録画ファイルの保存先やポートを変更したい場合は編集する。

しかし、このままでは全く動かなかった。(ここでも1週間くらい..)どうやら内部ビルドされたnodeがarmアーキテクチャに対応していないらしい。

```
$ rm -rfv /home/pi/chinachu/.nave
```
で内部ビルドされたnodeを削除すると、この問題は解決したので

```
$ cd /home/pi/chinachu
$ ./chinachu service wui execute
```
でChinachuサービスを起動させる。今度は起動するが、ファイルが足りないとのエラーが出るので、エラーを見ながら足りないファイルを手動でGithubから移した。
これでようやく問題が解決し、chinachuを使えるようになった。完成！

Chinachuの起動は、

```
$ cd /home/pi/chinachu
$ sudo pm2 start processes.json
```
で行った方が簡単に行えるので、こちらを使用している。

##使ってみる
デフォルトの設定だと、Chinachuの録画管理画面はブラウザから

```
http://[IPアドレス]:20772/
```
で開ける。ホーム画面では、現在放送中の番組の確認とライブ視聴ができる。しかし、Chinachuで内部ビルドされているffmpegというエンコードコマンドがARMだと動かないせいでブラウザからのリアルタイム視聴は実現できていない。
![Kobito.Z5rUWX.png](https://qiita-image-store.s3.amazonaws.com/0/190719/37799152-af90-1fcd-6f8d-dc7391f7bcfb.png "Kobito.Z5rUWX.png")

番組表画面では、1週間先までの番組表が閲覧できる。
![Kobito.LO1feH.png](https://qiita-image-store.s3.amazonaws.com/0/190719/34e38cc1-ccc0-3905-34eb-6c87764e773b.png "Kobito.LO1feH.png")

番組の詳細画面を開くことで、詳細確認や手動録画も可能。
![Kobito.ot6Y0V.png](https://qiita-image-store.s3.amazonaws.com/0/190719/cfb350e7-1354-1fef-0a3b-f51d3bad22c2.png "Kobito.ot6Y0V.png")

ルール画面では、かなり詳細な条件録画ができる。ここまで詳細な条件録画はテレビでもなかなかない。
![Kobito.0u6Umb.png](https://qiita-image-store.s3.amazonaws.com/0/190719/ca3ce50e-8c75-1f45-3eca-ab3cf69d6cf4.png "Kobito.0u6Umb.png")

##問題点
・Raspberry PiのCPUが貧弱なので、長時間リアルタイム視聴していると稀にストリーミングが止まる
・録画ファイルが大きすぎる。m2ts形式だと1分で120MB使うので1時間の録画で7.5GBになる。Sambaで録画ファイルを再生する際も帯域を使いすぎてストリーミングが頻繁に止まる。
⇨録画後に自動でmp4にエンコードする設定があるので今度試す 参考(http://ibulog-iblog.hateblo.jp/entry/2017/01/17/123733)
##感想
総額1万円少し(20インチの格安テレビと同額）にしては文句ない性能ではないだろうか。
##最後に
この記事は実際に完成させてから数ヶ月後に書いているので、説明が抜けている箇所があるかもしれません。気がついたらコメントで教えていただけるとありがたいです。
ChinachuやMirakurunは開発が盛んに行われており、頻繁にアップデートされています。[公式サイト](https://chinachu.moe/)を参照し、最新版を導入するようにして下さい。