備忘録です。録画サーバーというのを試してみました。Docker 環境があるので簡単に作成できました。ハードウェアエンコードも試してみたけど、安定しないので普通に構築するところまでのメモ。素人作業なので参考にする方は自己責任で。
追記:別記事ではH/Wエンコードを使った運用について書いています。
[Raspberry Pi4] [再]ラズパイで地デジ4チャンネル同時録画サーバ
試した環境
Raspberry Pi 4 8GB
Ubuntu Server 21.04 (備忘録)
docker-mirakurun-epgstation を使わせていただきました。
Docker はインストール済み (Dockerのインストール備忘録)
$ docker --version
Docker version 20.10.7, build f0df350
$ docker-compose --version
docker-compose version 1.29.2, build unknown
追加機材
PLEX USB接続型フルセグ対応地上デジタルTVチューナー PX-Q1UD
B-CASカード
追加機材をラズパイに接続します。
# チューナによってはファームウェアが必要となるらしい。PX-Q1UD の場合は下記が必要。
$ sudo apt-get install -y unzip
$ 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/x86/i386/isdbt_rio.inp /lib/firmware/
# 再起動する
$ sudo reboot
# ホスト側でも B-CAS カードが認識されるか確認しておく。(同じラズパイ4なのに、B-CASを認識しないボードがあってハマったため)
$ sudo apt install -y pcsc-tools pcscd
$ pcsc_scan
Japanese Chijou Digital B-CAS Card (pay TV)
# pcscd は止めておく
$ sudo systemctl stop pcscd.socket
$ sudo systemctl disable pcscd.socket
Mirakurun と EPGStation のコンテナを動かす
何も考えずに公式の手順に従います。
# 公式サイトの手順を順番に実行していく
$ git clone https://github.com/l3tnun/docker-mirakurun-epgstation.git
$ cd docker-mirakurun-epgstation
$ cp docker-compose-sample.yml docker-compose.yml
$ cp epgstation/config/config.yml.template epgstation/config/config.yml
$ cp epgstation/config/operatorLogConfig.sample.yml epgstation/config/operatorLogConfig.yml
$ cp epgstation/config/epgUpdaterLogConfig.sample.yml epgstation/config/epgUpdaterLogConfig.yml
$ cp epgstation/config/serviceLogConfig.sample.yml epgstation/config/serviceLogConfig.yml
$ docker-compose run --rm -e SETUP=true mirakurun
必要に応じて docker-compose.yml を修正します。ログがSDカードに書かれ続けるとSDカードがすぐ壊れてしまうので、logging の drive を none にしました。
# 各コンテナの定義に下記を追加
logging:
driver: none
コンテナを起動する
コンテナを起動します。初回はコンテナイメージのビルドが行われるため時間がかかります。コーヒーでものみながら、気長に待ちましょう。
$ docker-compose up -d
Building epgstation
...
(それなりにビルドに時間がかかります。20分ぐらい)
コンテナが起動したら、http://<ラズパイのアドレス>:8888 で、EPGStationにアクセスできるようになります。番組表などの取得にも少し時間が必要ですが、問題なく録画ができました👍
最初はPi4の4GBモデルを使って構築していたのだけど、B-CASカードを認識できなくてハマったよ💧 他のPi4やPi3では正常に認識できたので、途中から Pi4 8GB にSDカードを差し替えて作業しました。ハズレを引いたのかな~。謎です。🍣
おまけ:ハードウェアエンコードを試してみたが・・・TBC
Pi4でCPUパワーがあがったとはいえ、放映中の番組をストリーミングで見るのは難しいようです。録画したものをみるのには問題が無いのですが、放映中の番組をリアルタイムでみるときは、数秒ごとに動画がストップしてしまい、とてもみれるレベルではありません。また録画後のエンコードにもかなり時間がかかります。
ということで、ハードウェアエンコードについても調べてみました。が、現時点で安定稼働できていませんので、詳細は書かずに試した項目のメモだけ残しておきます。
参考にさせていただいたサイト
[ハードウェアエンコード] ラズパイ 64bit 環境でのハードウェアエンコード [Raspberry Pi]
Raspberry Pi 4 64ビット環境でffmpegをビルドしてハードウェアエンコードしてみました
Raspberry Pi 4 で MPEG-2 TS の動画を H.264 へハードウェアエンコードする際の負荷をみる
H/W エンコードに必要な設定
ググってわかったのは下記をやればコンテナからでもH/Wエンコードができそうだなということ。
- コンテナからホストのH/Wにアクセスできるようにする。
- ffmpeg 4.2.xだと動画が緑になるので、違うバージョンを使う必要があるらしい。
- h264_v4l2m2m というコーデック?を使う必要があるらしい。
- epgstation が h264_v4l2m2m を使ってエンコードをするように設定を変えてあげる。
試してみる
コンテナ側からもホストのH/Wにアクセスできるように
# /dev/vchiq にアクセスする必要があるらしい。そのパーミッションを変える。ラズパイもリブートしておく。
$ echo 'SUBSYSTEM=="vchiq",GROUP="video",MODE="0666"' | sudo tee /etc/udev/rules.d/10-vchiq-permissions.rules
# docker-compose.yml を編集して epgstationのコンテナから /dev 周りを見れるようにする
# /dev/video* が本当に必要かどうかがよくわかっていない。
# ホストのH/Wをいじれるように privileged: true にする
$ vi docker-compose.yml
epgstation:
build: epgstation
volumes:
- /etc/localtime:/etc/localtime:ro
- ./epgstation/config:/app/config
- ./epgstation/data:/app/data
- ./epgstation/thumbnail:/app/thumbnail
- ./epgstation/logs:/app/logs
- ./recorded:/app/recorded
- /dev/vchiq:/dev/vchiq
- /dev/video10:/dev/video10
- /dev/video11:/dev/video11
- /dev/video12:/dev/video12
- /dev/video13:/dev/video13
- /dev/video14:/dev/video14
- /dev/video15:/dev/video15
- /dev/video16:/dev/video16
privileged: true
ffmpeg のバージョンを変更する
そのままビルドしたコンテナを使うと、ffmpeg の 4.2.4 がビルドされる。最新のリリースが 4.4 だったのでとりあえずそれにしてみる。4.3系だと、4.3.2が最新みたい。configureのオプションには 手は加えない。先人たちが示すように、4.2.x で h264_v4l2m2m を指定してエンコードを行うと見事に緑色の動画が生成された。4.4 ではその現象は発生しなくなったのでうまくいっているっぽい。
# Dockerfile を編集
$ vi epgstation/Dockerfile
# ENV FFMPEG_VERSION=4.2.4
ENV FFMPEG_VERSION=4.4
# コンテナをビルドし直す
$ docker-compose build
よくわかっていないが、ベンチマーク的なものをやってみる。コンテナにはいってコマンドをたたいて 3分ぐらいの動画をエンコードしいる例。
# CPUでエンコードした場合。0.3倍速?なので10分以上かかった。エンコード中のCPU使用率は 380% 程度。
$ time ffmpeg -i test.m2ts -c:v libx264 -b:v 3M -y test.libx264.mp4
frame= 5631 fps=9.1 q=-1.0 Lsize= 75349kB time=00:03:07.78 bitrate=3287.0kbits/s dup=26 drop=0 speed=0.302x
real 10m21.868s
user 37m52.953s
sys 1m15.214s
# H/Wエンコードした場合。2.3倍速?なので1分ちょいで終わった。速い。エンコード中のCPU使用率は 180% 程度。
$ time ffmpeg -i test.m2ts -c:v h264_v4l2m2m -b:v 3M -num_capture_buffers 64 -y test.host.h264_v4l2m2m.mp4
frame= 5631 fps= 72 q=-0.0 Lsize= 71658kB time=00:03:07.55 bitrate=3129.9kbits/s dup=26 drop=0 speed=2.39
real 1m18.752s
user 2m14.459s
sys 0m14.174s
うまく動いているような・・・。エンコードされた動画もちゃんとみれる。CPUでエンコードしたほうがきれい。H/Wエンコードの方はギザギザした感じの動画になった。この辺はオプションで調整できるのかもしれない。
EPGstation の 設定を変更する
h264_v4l2m2m を使ったエンコードになるように設定ファイルを変更する
# libx264 が指定されているところを h264_v4l2m2m に置換する
$ emacs epgstation/config/config.yml
# 置換
# replace-string libx264 to h264_v4l2m2m
# こっちも適当に修正
$ emacs epgstation/config/enc.js
// コーデックを変更
//const codec = 'libx264';
const codec = 'h264_v4l2m2m';
// その他設定
Array.prototype.push.apply(args,[
'-preset', preset,
'-aspect', '16:9',
'-c:v', codec,
'-crf', crf,
'-b:v', '3M', // ビットレートの指定が必要らしいので追加。
'-f', 'mp4',
'-c:a', 'aac',
'-ar', '48000',
'-ab', audioBitrate,
'-ac', '2',
output
]);
とりあえず、これで録画後のエンコードが、H/Wエンコードに変わる。けど、2回目以降 エンコードが終わらなくなったり、録画そのものができなくなったり、不安定で運用にはいたらなかった。現状はここまで。
H/Wエンコードをちゃんと動かせたらステキですけど、そんなにテレビみないしなぁ🍣
それよりも、SDカードの寿命を気にするのはダルくなってきたので、SDカードからSSDに環境移そうかな。
コメント