[Raspberry Pi4] Ubuntu で地デジ4チャンネル同時録画サーバー with PX-Q1UD

Docker

備忘録です。録画サーバーというのを試してみました。Docker 環境があるので簡単に作成できました。ハードウェアエンコードも試してみたけど、安定しないので普通に構築するところまでのメモ。素人作業なので参考にする方は自己責任で。

試した環境

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

ICカードリーダー

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に環境移そうかな。

コメント

タイトルとURLをコピーしました