🍓 Raspberry Pi 4 が買えるようになりました
2019年11月、待望の Raspberry Pi 4 技適取得版が発売されました。H.264 ハードウェアエンコーダを搭載した、リッチなシングルボードコンピュータです。2020年5月28日には 8GB メモリ搭載の上位モデルも登場しています。
はたしてこれは何をするためのデバイスなのでしょうか?
そうです、録画ですね。もうテレビの録画をするために高価なパソコンを購入する必要はありません。5000円台から入手できるマシンを利用して、安価に録画サーバーを構築することができるようになったのです。
この記事では Raspbery Pi 4 を利用した Mirakurun + EPGStation での録画サーバー構築方法と、ハードウェアエンコーダを利用した録画ファイルのエンコードについて解説を行います。
Raspberry Pi の⼊⼿
Raspberry Pi 4 は一部の地域(主に秋葉原)店頭や、インターネットで手に入れることができます。標準的な 4GB モデルの末端価格は 7000 円ほど。
最低限パソコンとして動作させるためには、本体の他に電源と SD カードが必要です。
ヒートシンクや放熱用のファン、専用ケースの購入もあるといいでしょう。基板むき出しのまま雑に扱うと簡単に壊れてしまいます。私は金属にショートさせたり水をかけるなどして何台かゴミにしたことがあります。
そして重要なのが電源です。ここが不安定だと突然落ちてしまうことがあります。問題なく 3A を取ることができる、専用の電源を選ぶと良いでしょう。
録画マシン用パーツの入手
コンピュータを録画マシン化するためには以下のパーツが必要です。
- IC カードリーダー
- B-CAS カード
- TV チューナー
- ストレージ(HDD/SSD/NAS など)
今回IC カードリーダーは Gemalto IDBridge CT30、TV チューナーは PLEX PX-S1UD V2.0 で動作を確認しました。どちらも Amazon で購入できます。
筆者は長年TVチューナーとして PT3 を使っており、PCI Express スロットのない Raspberry Pi でチューナーを動かすという発想がありませんでした。しかし、現在は 1ch 録画可能な USB ドングルを5000円程度で入手することができます。これを複数個繋げば、その分だけチャンネルの追加が可能です。4ch 同時録画ができる PLEX PX-Q1UD でも動作するようです。
Raspberry Pi の SD カードではすぐに録画データが埋まってしまいますので、外付けの HDD や NAS も追加で必要ですね。どのストレージを使うかについては、各自のコスパ感と相談です。私は現在、ただのUSB接続ハードディスクを利用しています。
価格のブレが大きいストレージを除くと、これらは合計1万6000円ほどで買い集めることができました。B-CAS カードの調達方法は謎です。
🍓 Raspberry Pi のセットアップ
OS は Raspberry Pi OS を使って解説します。Raspberry Pi 向けの OS は Raspbian という名前でしたが、2020年5月に正式名称が変わりました。公式のイメージ書き込みツール Raspberry Pi Imager を使って、簡単にインストールすることができます。
IC カードリーダーのセットアップ
IC カードリーダーを扱うツールは以下のコマンドでインストールできます。
$ sudo apt update
$ sudo apt install pcscd libpcsclite-dev libccid pcsc-tools
pcsc-tools に含まれている pcsc_scan というコマンドで、IC カードの接続を確認することができます。
$ pcsc_scan | grep B-CAS
➡ Japanese Chijou Digital B-CAS Card (pay TV)
という表示が確認できれば成功です。
チューナーのセットアップ
今回地デジ TV チューナーとして PLEX PX-S1UD を利用します。ドライバはプレクスのサイトからダウンロードできます。
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/
usb-devices
コマンドで PX-S1UD が認識されていることを確認します。
$ usb-devices | grep PX-S1UD
➡ Product=PX-S1UD Digital TV Tuner
というものが表示されればインストール完了です。
arib25 のインストール
デコーダです。スクランブルされたかわいそうな電波を復号します。たぶんアライブ 25 と読みます。
$ wget https://github.com/stz2012/libarib25/archive/master.zip
$ unzip master.zip
$ cd libarib25-master
$ cmake .
$ make
$ sudo make install
recdvb のインストール
録画コマンドです。PT1/2/3 チューナーを利用していたことがある人は recpt1 を使っていたと思います。それを PX-S1UD などのチューナーで扱えるように改造されたものがこの recdvb です。arib25 でデコードを行いたいため、configure 時のオプションに--enable-b25
を指定します。
$ wget http://www13.plala.or.jp/sat/recdvb/recdvb-1.3.2.tgz
$ tar xvzf recdvb-1.3.2.tgz
$ cd recdvb-1.3.2
$ ./autogen.sh
$ ./configure --enable-b25
$ make
$ sudo make install
さて、これで簡単な録画が行えるようになりました。サンプル用に短い動画ファイルをつくってみましょう。
$ recdvb --b25 --strip 23 10 sample.m2ts
問題なくセットアップが完了していれば、再生可能な動画ファイルが発生しているはずです。
東京スカイツリーの支配下ではテレ東の番組が録画されたかと思いますが、地域によっては NHK が入っているかもしれません。
23 10 sample.m2ts
という部分でテレビ周波数チャンネル23を10秒間、 sample.m2ts
というファイルに保存する、という指示をしており、この物理のテレビ周波数チャンネルと放送局の組み合わせは地域によって異なります。対応する番号は Wikipedia などを利用して確認しましょう。
🍓 ハードウェアエンコードを行う
生の MPEG2-TS 動画を保存し続ける行為はストレージや帯域リソースへの負荷が高いです。なるべくエンコードしてエコに録画生活を行いたいものです。
Raspberry Pi 4 には H.264 のハードウェアエンコーダが搭載されており、CPU への負荷を抑えた高速なエンコードを行うことができます。
使用方法も難しいわけではなく、動画変換ツールのデファクトスタンダードである FFmpeg のハードウェアエンコーダ対応版を apt からそのまま入手することができます。
$ sudp apt update
$ sudo apt install ffmpeg
Raspberry Pi のハードウェアアクセラレーションを利用したエンコーダは「h264_omx
」という名前です。omx というのは組み込み機器向けマルチメディア API である OpenMAX の略称ですね。
ffmpeg -codecs
コマンドで対応しているコーデックを確認することができます。H.264 と書かれている行の利用できるエンコーダ欄に、その様子が確認できると思います。
$ ffmpeg -codecs
先程生成したサンプルファイルの m2ts をハードウェアエンコードして、mp4 ファイルに変換してみましょう。
$ ffmpeg -i sample.m2ts -codec:v h264_omx -b:v 3000k sample.mp4
まだなんとなく読めると思いますが、-codec:v h264_omx
を指定することでハードウェアエンコーダを利用して H.264 への変換を行います。
デフォルトでは圧縮率が高く画質が悪すぎるため、 -b:v
で映像ビットレートを 3000kb/s に 指定して画質(とファイルサイズ)を上げています。
18MB ほどあった m2ts が 3.5MB ほどの mp4 となりましたが、VLC メディアプレーヤーなどで問題なく再生することができるでしょう。
変換速度は極めて実用的です。おおよそ 1.42 倍速で変換することができました。試しにハードウェアエンコーダを使わない h264 を使ってみると、 0.295 倍速しかでません。使えなくもないスピードではありますが、時間と電気代の無駄遣い感があります。なによりCPU がフル回転してしまうため、リアルタイム視聴などの動作に影響が出てしまうかもしれません。
[h264_omx @ 0x887230] Using OMX.broadcom.video_encode
Output #0, mp4, to 'sample.mp4':
Metadata:
encoder : Lavf58.20.100
Stream #0:0: Video: h264 (h264_omx) (avc1 / 0x31637661), yuv420p, 1440x1080 [SAR 4:3 DAR 16:9], q=2-31, 3000 kb/s, 29.97 fps, 30k tbn, 29.97 tbc
Metadata:
encoder : Lavc58.35.100 h264_omx
Stream #0:1: Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s
Metadata:
encoder : Lavc58.35.100 aac
[mpegts @ 0x7931e0] PES packet size mismatchime=00:00:08.67 bitrate=2900.9kbits/s dup=17 drop=0 speed=1.42x
🍓 Mirakurun のセットアップ
おなじみ汎用デジタルチューナーサーバーである Mirakurun のインストールです。方法は Debian と変わりません。
Node.js のインストール
ここは好みによってお好きな方法で。Node.js をインストールする方法は 100 通りくらい考えられますが、パッケージマネージャーを利用する場合は以下のコマンドで完了します。
$ curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
$ sudo apt install nodejs
PM2 のインストール
プロセスマネージャです。サーバー再起動時にアプリケーションを自動起動したり、なんか死んだら叩き起こすといった仕事をします。
$ sudo npm install pm2 -g
Mirakurun のインストール
$ sudo npm install mirakurun -g --unsafe-perm --production
$ sudo mirakurun config tuners
config tuners
でチューナーの設定画面が開きますので、PX-S1UD を利用する設定を記載しましょう。使わないチューナーが記載されている場合は消すか isDisabled: true
を入れてあげてください。
- name: PX-S1UD-1
types:
- GR
command: recdvb --b25 --dev 0 <channel> - -
isDisabled: false
チューナーを設定したら、とりあえず Mirakurun を再起動してチューナースキャン。しばし待ったあと再起動し直します。
$ sudo mirakurun restart
$ sudo curl -X PUT "http://localhost:40772/api/config/channels/scan"
$ sudo mirakurun restart
mirakurn コマンドにより、PM2 を介した Mirakurun の起動/停止を行うことが出来ます。
🍓 EPGStation のセットアップ
録画管理ソフトとして EPGStation を利用します。同系ソフトの Chinachu でも快適に利用することはできますが、今回はハードウェアエンコーダを利用したエンコードを行いたいため、自動エンコード機能がサポートされているこちらを選択しました。
$ git clone https://github.com/l3tnun/EPGStation.git
$ cd EPGStation
$ sudo npm install
$ sudo npm run build
$ cp config/config.sample.json config/config.json
$ cp config/operatorLogConfig.sample.json config/operatorLogConfig.json
$ cp config/serviceLogConfig.sample.json config/serviceLogConfig.json
設定ファイルの編集。vim や VSCode Remote Development など利用して config/config.json
を編集します。ffmpeg のパスと録画したデータの保存先を変更すれば、基本的な利用ができるようになります。recorded のパスに関してはご自分でマウントした HDD や NAS などを保存先として指定するとよいでしょう。
"ffmpeg": "/usr/bin/ffmpeg",
"ffprobe": "/usr/bin/ffprobe",
"recorded": "/path/to/recorded",
"recordedTmp": "/path/to/recordedTmp",
余談ですが最近の VSCode Remote Development、Raspberry Pi で使えるし、統合ターミナルの窓でコマンドを打ちながら作業できて便利です。
ブラウザ上でのライブ視聴を利用する
EPGStation にはブラウザ上でライブ視聴を行う機能があります。ライブ視聴のフォーマットに関しては config.json
から指定することができ、デフォルトの config.json
ファイルでは M2TS / HLS / WebM / MP4 が利用できるよう定義されています。
ただし Raspberry Pi 4 の処理能力では、いずれもまともに動きません。無変換の M2TS のみ遅延なく再生することができますが、ブラウザ上での再生はできないため VLC メディアプレーヤーなどを経由することとなります。これはちょっと不便ですね。さきほどハードウェアアクセラレーションを利用したエンコードでは 1.4 倍速程度の程度の性能を出していましたので、これを使ってライブ視聴エンコードを行ってみましょう。
config/config.json
の liveMP4 という項目に、以下の設定を追加します。
{
"liveMP4": [
{
"name": "h264_omx",
"cmd": "%FFMPEG% -dual_mono_mode main -re -i pipe:0 -sn -codec:a aac -ar 48000 -ac 2 -b:a 192k -codec:v h264_omx -b:v 3000k -movflags frag_keyframe+empty_moov+faststart+default_base_moof -y -f mp4 pipe:1"
}
]
}
読めませんね。日本語に直すと「パイプで ffmpeg に動画を流し込み、多重音声放送ではメインの音声を分離して字幕を除去、変換速度は 1 倍速を保ちつつハードウェアアクセラレーションを利用して H.264 に変換、音声は AAC 2ch 48k 192kbps、HTML5 の Video タグで再生できるよういい感じにして、返事は「はい」、フォーマットは mp4 でパイプに流すこと。」となります。
その他のエンコード設定を変更する
録画時の自動エンコード、あるいは録画後のエンコードででもハードウェアアクセラレータを使うように変更しましょう。それらのエンコードに関しては EPGStation ディレクトリ内の config/enc.js
が利用される事となっているため、そのファイルを一部変更します。
14 行目あたりの codec を h264_omx
に変更
const codec = 'h264_omx';
40 行目あたり、その他設定の直前にビットレートの指定を追加します。
Array.prototype.push.apply(args, ['-b:v', '3000k']);
EPGStation を起動する
こちらも Mirakurun と同じく PM2 を利用してプロセスの管理を行いましょう。
npm run build
pm2 start dist/server/index.js -name "epgstation"
pm2 monit コマンドでプロセスが起動された様子を確認することができます。
以上により、同じ LAN 内のパソコンから http://raspberrypi.local:8888/ にアクセスしてテレビを視聴/録画することができるようになりました。このアドレスが開けない場合は「raspberrypi.local」の部分を Raspberry Pi の IP アドレスに変更してください。
…あとがき
特に見るわけでもないテレビのパソコン録画活動を続けて10年以上の月日が経ちました。録画を取り巻く環境は日々進化し続けています。意外と録画が不要になる日は来ません。と言いつつ別に見ていないのであれば最初から不要だった気もします。ということは、今後もやっていくことになるのだと思います。よろしくお願いします。
Writer: kkosuge
Editor: kanreisa / Yuki K.
Publication: 空気録学電子版 (C98v)