Raspberry pi 3 と KTV-FSUSB2 で録画鯖を作った

言いたいことなど

先にあとがき

実運用というより今後のためのテスト目的だったが、そういった意味ではうまく行った。
苦労したくないなら、ハードウェアは新しいものを使ったほうが情報が集まりやすくて良いのではないかと思う。

後日談

NFSを使ってファイル鯖に動画を保存するようなことも試したが、
ラズパイ3のエンコードはおそすぎるので役割を分割し、
EPGStation は自作ファイル鯖で動作させるようにした。
また、ラズパイ3は100Mbpsの有線ネットワークなので、
Gigabit対応のUSBのLAN(ただしUSB2.0接続なので、480Mbpsが上限)を接続し、
有線の速度をマシにした。
テストは無事だったのでラズパイ4買うか。

使用したもの

  • ラズパイ3
  • microSD 32GB
  • KTV-FSUSB2(10年程前にpatchV2適用済み)
  • 青BCASカード
  • カードリーダーは不要。カードはFSUSB2本体に挿して使う。

作業の流れ

OSの準備

Raspberry Pi 初期設定

RECFSUSB2Nのインストール

# インストール
sudo apt install gcc g++ libboost-thread-dev libboost-system-dev libboost-filesystem-dev
git clone https://github.com/stz2012/recfsusb2n.git
cd recfsusb2n
make
sudo make install
sudo gpasswd -a pi video
sudo reboot
# 確認
lsusb | grep 0511
# => "Bus 001 Device 004: ID 0511:0029 N'Able (DataBook) Technologies, Inc."

# 録画テスト ※地域に合わせてチャンネル指定を。
# https://www.maspro.co.jp/contact/bro/bro_ch.html
# 下記の例だと、26チャンネルを30秒録画する
recfsusb2n -bv 26 30 test.ts

別の端末に持ってきて適当なプレイヤーで再生テストする。
scp user@ip:test.ts .

再生できたらもう作業の殆どが終わり。

Mirakurunのインストール

当初Docker版を入れようとしてたが、
armは非対応だったため、npmでインストールすることになった。
公式ドキュメントはこちらだが、
nodejs ver.14 だとEPGStationが対応してないようなので、ver.12で以下のように入れた。

curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt-get install -y nodejs
sudo npm install pm2 -g
sudo npm install mirakurun -g --unsafe-perm --production
# 必要であれば編集する
sudo mirakurun config server
# RECFSUSB2Nとの連携を設定する
sudo mirakurun config tuners
#- name: KTV-FSUSB2
#  types:
#    - GR
#  command: recfsusb2n -bv <channel> - -
#  isDisabled: false

# 東京タワー以外の方はチャンネルも更新する
# 先程のマスプロのリンク参照
sudo mirakurun config channels

# 起動
sudo mirakurun start
sudo mirakurun status

# テスト
curl http://localhost:40772/api/version
バージョンが返ってきたらOK

EPGStation のインストール

公式ドキュメント通り進める。

git clone https://github.com/l3tnun/EPGStation.git
cd EPGStation/
npm install --no-save
cp config/config.sample.json config/config.json
cp config/operatorLogConfig.sample.json config/operatorLogConfig.json
cp config/serviceLogConfig.sample.json config/serviceLogConfig.json
## ffmpeg ffprobe のパスの書き換え
vi config/config.json
#    "ffmpeg": "/usr/bin/ffmpeg",
#    "ffprobe": "/usr/bin/ffprobe",

# encoder はlibx264だと現実的な速度がでないので、h264_omx を利用したほうが良いと思われる。
# 下のブロックに変更内容を記載する。

# 自動起動設定
sudo pm2 startup
pm2 start dist/server/index.js --name "epgstation"
pm2 save

# 動作確認
curl -I http://localhost:8888/
$ # エンコードは最低レベルの変更で以下のように変更した。
$ #yadifを入れると、変換速度が半分ほどになり、15fpsほどしか出ないので速度重視なら抜いてもいいかも。
$ git diff
diff --git a/config/enc.js b/config/enc.js
index 81ae7c8..8e9191f 100644
--- a/config/enc.js
+++ b/config/enc.js
@@ -11,7 +11,8 @@ const videoHeight = parseInt(process.env.VIDEORESOLUTION, 10);
 const isDualMono = parseInt(process.env.AUDIOCOMPONENTTYPE, 10) == 2;
 const audioBitrate = videoHeight > 720 ? '192k' : '128k';
 const preset = 'veryfast';
-const codec = 'libx264';
+const codec = 'h264_omx';
+const bitrate = '3000k';
 const crf = 23;
 
 const args = ['-y', '-analyzeduration', analyzedurationSize, '-probesize', probesizeSize];
@@ -32,9 +33,9 @@ Array.prototype.push.apply(args,['-movflags', 'faststart']);
 
 // video filter 設定
 let videoFilter = 'yadif';
-if (videoHeight > 720) {
-    videoFilter += ',scale=-2:720'
-}
+//if (videoHeight > 720) {
+//    videoFilter += ',scale=-2:720'
+//}
 Array.prototype.push.apply(args, ['-vf', videoFilter]);
 
 // その他設定
@@ -42,7 +43,8 @@ Array.prototype.push.apply(args,[
     '-preset', preset,
     '-aspect', '16:9',
     '-c:v', codec,
-    '-crf', crf,
+    '-b:v', bitrate,
+//    '-crf', crf,
     '-f', 'mp4',
     '-c:a', 'aac',
     '-ar', '48000',

楽しむ

ローカルネットワーク内のブラウザから
http://<IP of RaspberryPi>:8888/
にアクセスして表示されたら作業完了。