Ryzenの内蔵GPUを使ってハードウェアエンコードできるようにした。

用意したもの

システム構成図

構成図

地デジ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で動作確認。

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コマンドで確認した。ちゃんと使われていることが分かる。

GPU使用率

次はシステム全体の消費電力を計測する。
消費電力を計測しました→2023-12-02 録画システムの消費電力を計測する