Raspberry Pi 4 で構築する録画マシン

kkosuge
kkosuge
Jun 13, 2020 · 15 min read

🍓 Raspberry Pi 4 が買えるようになりました

2019年11月、待望の Raspberry Pi 4 技適取得版が発売されました。H.264 ハードウェアエンコーダを搭載した、リッチなシングルボードコンピュータです。2020年5月28日には 8GB メモリ搭載の上位モデルも登場しています。

はたしてこれは何をするためのデバイスなのでしょうか?

そうです、録画ですね。もうテレビの録画をするために高価なパソコンを購入する必要はありません。5000円台から入手できるマシンを利用して、安価に録画サーバーを構築することができるようになったのです。

この記事では Raspbery Pi 4 を利用した Mirakurun + EPGStation での録画サーバー構築方法と、ハードウェアエンコーダを利用した録画ファイルのエンコードについて解説を行います。

筆者の⾃宅で運⽤している録画サーバーの様⼦

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 を使って、簡単にインストールすることができます。

書き込むOSとSDカードを選択するだけ

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 というものが表示されればインストール完了です。

2020年7月6日 編集者注: 下記のコマンドで adapter… が出てくれば正常に DVB デバイスとして認識されています。

$ ls -l /dev/dvb/

2020年7月4日 追記: この記事の初稿では recdvb コマンドでの利用を紹介していましたが、PX-S1UD は Linux 標準の DVB API が使えます。apt を利用して、dvb-tools をインストールします。

$ sudo apt install dvb-tools

🍓 ハードウェアエンコードを行う

生の 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

例として sample.m2ts という生の TS ファイルがある場合、以下のコマンドでハードウェアエンコードを利用した 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
ハードウェアエンコーダを利用すると CPU 利用率にもそれなりの余裕が見られます

🍓 Mirakurun のセットアップ

おなじみ汎用デジタルチューナーサーバーである Mirakurun のインストールです。

ここは好みによってお好きな方法で。Node.js をインストールする方法は 100 通りくらい考えられますが、パッケージマネージャーを利用する場合は以下のコマンドで完了します。

$ curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
$ sudo apt install nodejs

プロセスマネージャです。サーバー再起動時にアプリケーションを自動起動したり、なんか死んだら叩き起こすといった仕事をします。

$ sudo npm install pm2 -g
$ sudo npm install mirakurun@latest -g --unsafe-perm --production
$ sudo npm install arib-b25-stream-test -g --unsafe-perm

mirakurn コマンドにより、PM2 を介した Mirakurun の起動/停止を行うことが出来ます。

$ sudo mirakurun start

以下のコマンドでチャンネルのスキャンを行うことができます(起動時に自動でスキャンはされるはずですが)

$ sudo curl -X PUT "http://localhost:40772/api/config/channels/scan"
$ sudo mirakurun restart

🍓 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 で使えるし、統合ターミナルの窓でコマンドを打ちながら作業できて便利です。

最近の VSCode Remote Development, 録画サーバー用IDEとしての進化を遂げています

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']);

こちらも 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 アドレスに変更してください。

スマートフォンから視聴することも出来ます。最高ですね。
2012年頃、録画に使ってたサーバー
2012年頃、録画に使ってたサーバー

特に見るわけでもないテレビのパソコン録画活動を続けて10年以上の月日が経ちました。録画を取り巻く環境は日々進化し続けています。意外と録画が不要になる日は来ません。と言いつつ別に見ていないのであれば最初から不要だった気もします。ということは、今後もやっていくことになるのだと思います。よろしくお願いします。

Writer: kkosuge
Editor: kanreisa / Yuki K.
Publication: 空気録学電子版 (C98v)

空気録学電子版【公式】

録画界 №1 オサレポエム同人雑誌に関する情報 | Chinachu や Mirakurun に関する情報 | YouTube に関する情報 | Writer 募集中

Medium is an open platform where 170 million readers come to find insightful and dynamic thinking. Here, expert and undiscovered voices alike dive into the heart of any topic and bring new ideas to the surface. Learn more

Follow the writers, publications, and topics that matter to you, and you’ll see them on your homepage and in your inbox. Explore

If you have a story to tell, knowledge to share, or a perspective to offer — welcome home. It’s easy and free to post your thinking on any topic. Write on Medium

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store