シングルボードコンピューター(NanoPi R4S)とミニPC(Ren5000)で録画システムを構築した
2023-11-24Ryzenの内蔵GPUを使ってハードウェアエンコードできるようにした。
用意したもの
- GenMachine Ren5000(Ryzen 3 5300U)
- NanoPi R4S(4GB)
- PX-S1UD V2.0 x 3
- PX-BCUD x 2
- PX-M1UR x 1
- サンワサプライ USB-3H703BKN
- カードリーダー SCR3310
システム構成図
地デジ3系統、BC/CS3系統の計6ch同時視聴(録画)が可能な構成とした。PX-Q3U4買ったほうがお得とか言わない
MirakurunとEPGStationをハード的に分離して動かすことにした。理由は以下の通り。
- 負荷分散
- カーネルとの相性
- PX-BCUDは通常のカーネルだとドロップが多発する
- Radeonドライバーはリアルタイムカーネルだと動作しない(=HWエンコーダが機能しない)
両方ともをRen5000に入れてしまうと、BSのドロップかHWエンコードかを諦める必要がある。そこで、サーバーを物理的に分けることで解決した。
PX-BCUDは既にディスコン。ヤフオクで中古を入手した。プレミア化しているので今から購入するのはお勧めしません。
NanoPi R4Sでチューナーサーバー(Mirakurun)構築
Linux nanopi-r4s 6.1.46-rt14-rc1-rockchip64 #3 SMP PREEMPT_RT Thu Aug 17 01:27:31 JST 2023 aarch64 aarch64 aarch64 GNU/Linux
OSはArmbianをリアルタイムカーネルで使用する。ビルド方法はこちら。
Dockerのインストール
$sudo apt -y install docker.io
$sudo apt -y install docker-compose
$sudo usermod -aG docker $USER
$sudo reboot
チューナーのファームウェアの配置
$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/
PX-M1URのドライバーのインストール
tsukumijima氏が本家からフォークしたドライバーを使わせてもらう。実験的なサポートということだが問題なく使用可能だった。 手順はREADME.md参照。
docker-mirakurun-epgstationのセットアップ
Dockerイメージとして用意されているdocker-mirakurun-epgstationを少し変更して使う。
$curl -sf https://raw.githubusercontent.com/l3tnun/docker-mirakurun-epgstation/v2/setup.sh | sh -s
$cd docker-mirakurun-epgstation
docker-compose.ymlの"mysql:"以降、EPGStationに関連するところを削除する。
recpt1コマンドをDocker内で使えるようにする。手順はこちらを参照した。
$mkdir -p ./mirakurun/opt/bin/startup
$nano ./mirakurun/opt/bin/startup # example ↓
$chmod +x ./mirakurun/opt/bin/startup
startupの内容は以下の通り。
#!/bin/bash
if !(type "recpt1" > /dev/null 2>&1); then
apt-get update
apt-get install -y --no-install-recommends git autoconf automake
cd /tmp
git clone https://github.com/stz2012/recpt1.git
cd recpt1/recpt1
./autogen.sh
./configure --prefix /opt
make
make install
fi
recpt1 -v
後は以下のコマンドでdockerを起動すればよい。
$sudo docker-compose run --rm -e SETUP=true mirakurun
$sudo docker-compose up -d
TVTestで動作確認。
Ren5000で録画サーバー(EPGStation)構築
Linux ubuntu-server 5.15.0-87-generic #97-Ubuntu SMP Mon Oct 2 21:09:21 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
OSはUbuntu Serverを使用した。SSH接続で全部セットアップするのでGUIは不要。
Radeonドライバーのインストール
新しいドライバーだとFFmpegが対応していない。(1週間位詰まった)
試行錯誤したところ、FFmpeg 6.0と、Radeonドライバー 23.10.2で動作することが確認できた。
$wget https://repo.radeon.com/amdgpu-install/23.10.2/ubuntu/jammy/amdgpu-install_5.5.50502-1_all.deb
$sudo apt install ./amdgpu-install_5.5.50502-1_all.deb
$amdgpu-install -y --usecase=graphics,amf --opencl=rocr --no-32
とりあえず、最新のドライバーを使うのは辞めたほうが良い。動かないから。
FFmpegのビルド
今回はFFmpegでRadeonのハードウェアエンコーダ(h264_amf)を使えるようにする。 Docker内だとffmpegのh264_amfエンコーダが使えない。よって直にインストールする。
$sudo apt update
$sudo apt -y install make gcc git g++ automake curl wget autoconf build-essential libass-dev libfreetype6-dev libsdl1.2-dev libtheora-dev libtool libva-dev libvdpau-dev libvorbis-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev pkg-config texinfo zlib1g-dev
$sudo apt -y install yasm libx264-dev libmp3lame-dev libopus-dev libvpx-dev
必要なパッケージはdocker-mirakurun-epgstation/epgstation/debian.Dockerfileから拝借した。
$curl -fsSL http://ffmpeg.org/releases/ffmpeg-6.0.tar.bz2 | tar -xj --strip-components=1
$./configure \
--prefix=/usr/local \
--disable-shared \
--pkg-config-flags=--static \
--enable-gpl \
--enable-libass \
--enable-libfreetype \
--enable-libmp3lame \
--enable-libopus \
--enable-libtheora \
--enable-libvorbis \
--enable-libvpx \
--enable-libx264 \
--enable-libx265 \
--enable-version3 \
--enable-libaribb24 \
--enable-nonfree \
--disable-debug \
--disable-doc
make -j$(nproc)
sudo make install
確か--enable-amfは不要だった気がする(うろ覚え) これでFFmpegは完成。
ffmpeg -encoders
ffmpeg version 6.0 Copyright (c) 2000-2023 the FFmpeg developers
built with gcc 11 (Ubuntu 11.4.0-1ubuntu1~22.04)
configuration: --prefix=/usr/local --disable-shared --pkg-config-flags=--static --enable-gpl --enable-libass --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-version3 --enable-libaribb24 --enable-nonfree --disable-debug --disable-doc
~~~略~~~
V....D libx264 libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (codec h264)
V....D libx264rgb libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 RGB (codec h264)
V....D h264_amf AMD AMF H.264 Encoder (codec h264) ←これ
V..... h264_v4l2m2m V4L2 mem2mem H.264 encoder wrapper (codec h264)
EPGStationのインストール
セットアップマニュアルに沿ってセットアップすればよい。
config/config.yml
stream:
live:
ts:
m2tsll:
- name: 720p
cmd:
'%FFMPEG% -dual_mono_mode main -f mpegts -analyzeduration 500000 -i pipe:0 -map 0 -c:s copy -c:d
copy -ignore_unknown -fflags nobuffer -flags low_delay -max_delay 250000 -max_interleave_delta 1
-c:a aac -ar 48000 -b:a 192k -ac 2 -c:v h264_amf -flags +cgop -vf yadif,pp=ac,scale=-1280:720,eq=saturation=1.2
-b:v 3000k -preset faster -y -threads 3 -f mpegts pipe:1'
webm: []
hls: []
mp4: []
recorded:
ts:
webm: []
mp4: []
hls:
- name: 720p
cmd:
'%FFMPEG% -dual_mono_mode main -i pipe:0 -sn -map 0 -threads 2 -ignore_unknown
-max_muxing_queue_size 1024 -f hls -hls_time 3 -hls_list_size 0 -hls_allow_cache 1
-hls_segment_filename %streamFileDir%/stream%streamNum%-%09d.ts -hls_flags delete_segments -c:a
aac -ar 48000 -b:a 192k -ac 2 -c:v h264_amf -vf yadif,scale=1280:720,eq=saturation=1.2 -b:v 3000k -preset veryfast
-flags +loop-global_header %OUTPUT%
不要なものを削除してエンコーダをh264_amfにした。
$sudo npm start
amfエンコーダを使うのにルート権限が必要っぽいので、sudoで起動する必要あり。
まとめ
録画したものをHLS形式で視聴した時のGPU使用率をnvtopコマンドで確認した。ちゃんと使われていることが分かる。
次はシステム全体の消費電力を計測する。
消費電力を計測しました→2023-12-02 録画システムの消費電力を計測する