NanoPi R6S に Debian 11 Bullseye (Core) をインストールして rkmppenc で HW エンコード

以前の記事で紹介した NanoPi R6S ですが、何かやらかしたのか Ubuntu のデスクトップが起動しなくなってしまったこと、さらに色々いじっていたら環境が壊れたこともあり、OS を入れ直すことにしました。

NanoPi の製造元である FriendlyElec が提供している OS イメージ にはいくつかあるのですが、Ubuntu は一度試したこと、実際用途上デスクトップ環境はほとんど使わないので不要なこと、その割に Ubuntu Server がないこと…と考えると、必然的に Debian 11 Bullseye の Core イメージ(CLI のみで軽量、おそらくサーバー向き)に絞られます。

FriendlyCore という Ubuntu Core の派生版イメージもありますが、どこが Ubuntu Core から変わっているのか分からないのとベースの Ubuntu が 20.04 と少し古いので、今回はやめておきました。
そもそも Ubuntu Core はコンテナ前提のシステムのはずで普段使いには向いてなさそうなのですが、ネットの記事を見ると普通に apt install できてしまっているので謎…。このあたりがカスタムされてる所以なのかも。

NanoPi R5Sの Ubuntu を 22.04にアップデートする - Qiita
NanoPi R5SにはメーカーよりfriendlycoreというUbuntu20.04ベースのOSが提供されています。通常20.04で困ることは無いと思いますが、systemd.network の…

このあたりについて調べていると、NanoPi R5S (RK3568 SoC) で Ubuntu 22.04 をインストールしようとしている方がいました。イメージを自作する際は参考にできそうです。

今回は rk3588-sd-debian-bullseye-core-5.10-arm64-20230403.img.gz をインストールしました。CLI だけなので、ファイルサイズも 470MB と非常に小さいです。

インストール方法は以前の記事で紹介したので割愛します。今回は Windows と直接つなげてインストールしようとしたのですが、うまく認識しなかった(ケーブルが悪いのか、あるいはうまく MaskROM モードに入れていないのか…)ため、結局前と同様に MicroSD カード経由でインストールしました。
少し手間は掛かるものの、無難で安全な方法ではあります。

前の記事でも紹介しましたが、一度 OS をインストールした状態から別の OS を入れ直す場合は、MicroSD カードで起動した FriendlyWrt に SSH 接続した上で、/dev/mmcblk2p8/dev/mmcblk2p9 の中身を削除しておく必要があります。
削除しなくてもインストール自体はできますが、その後の動作がいろいろおかしくなるので(一度経験済み)、やめたほうが無難です…。

Sponsored Link

SSH ログイン・最低限の設定

eMMC Tools で OS を書き込んだら、LAN ケーブルを家のルーターにつなげます。

そのまま HDMI でコンソールログインしても良いのですが、私は HDMI をつなげるのが諸々面倒だったので、Advanced IP Scanner で起動中の LAN 内のデバイスをスキャンした後、それっぽいデバイスに片っ端から SSH して DHCP で自動割り当てされたローカル IP アドレスを見つけました。

NanoPi R6S に割り当てられたローカル IP アドレスを見つけたら、その IP アドレス宛に SSH しましょう。

デフォルトのユーザー名とパスワードは、Ubuntu 22.04 LTS Desktop と同様に pi です。
なお、デフォルトのホスト名は NanoPi-R6S になっています。私は変更する必要性を感じなかったので、そのままにしておきました。

apt のパッケージリポジトリの変更

FriendlyElec のイメージでは、デフォルトでパッケージリポジトリが http://mirrors.163.com/debian という中国にあるっぽい怪しいリポジトリになっています。
問題なさそうな気もしますがちょっと怖いので、Debian 公式のミラーに変更します。

sudo nano /etc/apt/sources.list
----------------------------------------------------------------
deb http://ftp.jp.debian.org/debian bullseye main contrib non-free
deb-src http://ftp.jp.debian.org/debian bullseye main contrib non-free
deb http://security.debian.org/debian-security bullseye-security main contrib non-free
deb-src http://security.debian.org/debian-security bullseye-security main contrib non-free
deb http://ftp.jp.debian.org/debian bullseye-updates main contrib non-free
deb-src http://ftp.jp.debian.org/debian bullseye-updates main contrib non-free

/etc/apt/sources.list に上記内容を書き込んでおきます。

あとあと調べたところ、www.163.com は中国国内だと有名なニュースポータルサイトのようです。
少なくとも得体の知れない運営者が管理しているわけではなさそう…?

apt パッケージの更新

sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y

まずはお決まりのこれを。Debian とはいえこのあたりの手順は Ubuntu と同じなのでかんたんです。

ロケール変更と日本語化

せっかくなので、日本語化と同時に JST にしておきましょう。
このあたりはちょっと Ubuntu と違うので面倒です。

sudo apt install -y locales-all manpages-ja manpages-ja-dev
sudo bash -c 'echo "ja_JP.UTF-8 UTF-8" > /etc/locale.gen'
sudo locale-gen
export LANG=ja_JP.UTF-8
export LC_ALL=ja_JP.UTF-8
sudo timedatectl set-timezone Asia/Tokyo

上記のコマンドを実行して、日本語化とロケールの変更を行います。

$ date
2023年  4月 10日 月曜日 21:52:05 JST

date コマンドの結果が日本語かつ JST になっていれば大丈夫でしょう。

ちなみにログイン時に Linux NanoPi-R6S 5.10.110 #176 SMP Fri Feb 17 20:39:34 CST 2023 aarch64 GNU/Linux って出てきますが、これは単にカーネルが Fri Feb 17 20:39:34 CST 2023 (中国時間) にビルドされた、ということだけを意味してるみたいでした。

最低限必要なツールをインストール

sudo apt install -y at build-essential ca-certificates cmake cron curl dialog ffmpeg git htop less nano net-tools ncdu perl unzip zip

この Debian 11 Bullseye イメージには本当に最小限のツールしか入っていないようで、Ubuntu ならだいたい標準装備のツール群が入っていません。このタイミングでインストールしておきます。

sudo apt install -y /opt/linux-headers-5.10.110.deb

また、NanoPi R6S の公式イメージでは、Rockchip や FriendlyElec がカスタマイズした固定バージョンの独自カーネル (BSP カーネル) が採用されています。
標準ではカーネルヘッダーがインストールされていないのですが、これでは px4_drv をはじめとしたカーネルドライバをビルドする際に支障します。

ARM SoC ではこの点が問題になることが少なくないのですが、幸いにも /opt/linux-headers-5.10.110.deb に公式で Debian パッケージを置いてくれているので、それをインストールしておきましょう(カーネルバージョンに関しては公式イメージのバージョン次第で変わるかも?)。

.bashrc の編集

以前 net-tools をインストールし ifconfig が使えるようにしているのですが、どうもデフォルトでは /sbin/ 以下にインストールされる上に、/sbin/ にはパスが通っていません。

nano ~/.bashrc
------------------------------------------------
(省略)
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi


# ----------------------------------------------------------------

# Alias
alias ls="ls --color=auto"
alias ll="ls --color=auto -l"
alias la="ls --color=auto -la"

# PATH
export PATH="$HOME/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"

# oh-my-posh
eval "$(oh-my-posh --init --shell bash --config ~/.poshthemes/powerline-custom.omp.json)"

# 履歴をリアルタイムで保存/読込する
export PROMPT_COMMAND="$PROMPT_COMMAND history -a; history -r"

いいタイミングなので、ここで ~/.bashrc を編集し、パスやエイリアスを登録しておきましょう。
上記のように編集し、もう一度ログインすると適用されます。

Powerline (oh-my-posh) のインストール

個人的にいろいろなデバイスに設定しているので(入れるとコマンドラインが見やすくなる)。
v3.130.1 で固定している理由は、それ以降のバージョンだと確か文字化け?があったのと、バージョンアップと破壊的変更が多く疲れたため…。

# 本体のダウンロード
sudo wget https://github.com/JanDeDobbeleer/oh-my-posh/releases/download/v3.130.1/posh-linux-arm -O /usr/local/bin/oh-my-posh

# 実行権限の付与
sudo chmod +x /usr/local/bin/oh-my-posh

# テーマのダウンロード
mkdir ~/.poshthemes
wget https://github.com/JanDeDobbeleer/oh-my-posh/releases/download/v3.130.1/themes.zip -O ~/.poshthemes/themes.zip
unzip ~/.poshthemes/themes.zip -d ~/.poshthemes
chmod u+rw ~/.poshthemes/*.json
rm ~/.poshthemes/themes.zip

# 個人的に自作したカスタムテーマのダウンロード
wget https://gist.githubusercontent.com/tsukumijima/14354560ee91739a9d3e2238c1f03f91/raw/38db4c79e66252a736b3f7926d45fc07f3fcdff6/powerline-custom.omp.json -O ~/.poshthemes/powerline-custom.omp.json

# 背景色を変更する (#1689B1 -> 任意の色)
nano ~/.poshthemes/powerline-custom.omp.json

SSH をパスワード認証から公開鍵認証に変更する

デフォルトで SSH はパスワード認証になっていますが、毎回パスワードを入力するのがめんどくさいので、公開鍵認証に変更します。ついでに個人的に SSH のポートはすべて 10022 に統一しているので、それもやっておきます。

この作業たまにしかやらないので忘れがちなのですが、ChatGPT (GPT-4) に訊いたらドンピシャな手順を示してくれたのでそのまま貼っておきます。技術ブログの必要性…。

# Windows の場合は WSL 環境に入っておかないとうまく実行できないので注意
$ bash
$ pwd
/mnt/c/Users/User

# クライアント側でSSHキーペア(公開鍵と秘密鍵)を生成する
$ ssh-keygen -t rsa -b 4096 -f .ssh/NanoPi-R6S

# 生成された公開鍵を NanoPi R6S 側にコピーする (このコマンド ChatGPT に教えてもらうまで知らなかった…)
$ ssh-copy-id -i .ssh/NanoPi-R6S.pub [email protected]

# 最後に秘密鍵ファイルを pem にリネーム (個人的に拡張子があった方がなんとなく好きなので)
$ mv .ssh/NanoPi-R6S .ssh/NanoPi-R6S.pem

# WSL 環境を出る
exit

# NanoPi R6S に SSH でログインし、SSH 設定ファイルを下記のとおり編集
ssh [email protected]
sudo nano /etc/ssh/sshd_config
-------------------------------------------------------
#Port 22
Port 10022
...
#PubkeyAuthentication yes
PubkeyAuthentication yes
PasswordAuthentication no
-------------------------------------------------------

# 編集が完了したら、ファイルを保存して閉じる
# 次に、SSH サービスを再起動して設定を適用する
sudo service ssh restart

ここまで来たら、後は下記のように SSH で公開鍵ログインするだけです。

ssh -p 10022 -i ~/.ssh/NanoPi-R6S.pem [email protected]

ただ毎回入力するのは面倒なので、~/.ssh/config に設定を追記しておきましょう。

Host NanoPi-R6S
  HostName 192.168.1.59
  Port 10022
  User pi
  IdentityFile ~/.ssh/NanoPi-R6S.pem
  TCPKeepAlive yes
  IdentitiesOnly yes

こうしておけば、次回以降は ssh NanoPi-R6S だけで SSH ログインできるようになります!

そのほかのあった方が良いソフトをインストール

neofetch

sudo apt install -y neofetch

インストールしておくと、このような画面を出せる。ただそれだけ。

avahi-daemon / samba

sudo apt install -y avahi-daemon samba

avahi-daemon は mDNS サービス(?)で、インストールしておくと nanopi-r6s.local のドメインで NanoPi R6S で起動中の各サーバーにアクセスできるようになります。ラズパイの Raspbian (Raspberry Pi OS) には最初からインストールされています。
たとえば NanoPi-R6S に Apache をインストールしている場合、ローカル LAN 内なら http://nanopi-r6s.local/ で Apache の HTTP ページにアクセスできるはずです。

一方の Samba は言わずとしれた SMB ファイル共有サーバーです。手元にあるディレクトリを Windows のネットワークドライブとしてネットワーク経由で共有できます。

sudo nano /etc/samba/smb.conf
------------------------------------------------------------------------
# ↓↓↓↓↓ コメントアウト
;[homes]
;   comment = Home Directories
;   browseable = no

# By default, the home directories are exported read-only. Change the
# next parameter to 'no' if you want to be able to write to them.
;   read only = yes

# File creation mask is set to 0700 for security reasons. If you want to
# create files with group=rw permissions, set next parameter to 0775.
;   create mask = 0700

# Directory creation mask is set to 0700 for security reasons. If you want to
# create dirs. with group=rw permissions, set next parameter to 0775.
;   directory mask = 0700

# By default, \\server\username shares can be connected to by anyone
# with access to the samba server.
# The following parameter makes sure that only "username" can connect
# to \\server\username
# This might need tweaking when using external authentication schemes
;   valid users = %S
# ↑↑↑↑↑ コメントアウト

# ↓↓↓↓↓ コメントアウト
;[printers]
;   comment = All Printers
;   browseable = no
;   path = /var/spool/samba
;   printable = yes
;   guest ok = no
;   read only = yes
;   create mask = 0700

# Windows clients look for this share name as a source of downloadable
# printer drivers
;[print$]
;   comment = Printer Drivers
;   path = /var/lib/samba/printers
;   browseable = yes
;   read only = yes
;   guest ok = no
# ↑↑↑↑↑ コメントアウト
# Uncomment to allow remote administration of Windows print drivers.
# You may need to replace 'lpadmin' with the name of the group your
# admin users are members of.
# Please note that you also need to set appropriate Unix permissions
# to the drivers directory for these users to have write rights in it
;   write list = root, @lpadmin

# ↓↓↓↓↓ 追記
[NanoPi-R6S]
   # 共有するフォルダのパス
   path = /
   # 書き込みを許可する
   writable = yes
   # 強制的に利用する UNIX ユーザーの名前
   force user = pi
   # ファイル/ディレクトリの書き込みモード
   force create mode = 0644
   force directory mode = 0755

インストール後、smb.conf を編集して、上記のように変更しておきましょう。

sudo smbpasswd -a pi

また、Samba のユーザーと Linux のユーザーは微妙に概念が分かれているようで、別途 Samba のユーザーにパスワードを設定する必要があります。
上記コマンドで設定しておきましょう。私は Linux ユーザーの方と同じく同じく pi にしておきました(短すぎる気もしますが…)。

sudo service smbd restart && sudo service nmbd restart

あとはサービスを再起動すれば、Windows から \\nanopi-r6s.local として NanoPi R6S のファイルシステムにアクセスできるようになります…!
パーミッションの関係で pi ユーザーでは /etc/ などシステムフォルダには読み取り専用ですが、/home/pi/ 以下であればメイン PC とのファイルの受け渡しが容易になるので、たとえば NanoPi R6S で生成したデータをメイン PC で見たり、逆にメイン PC で作成したデータを NanoPi R6S に送ったりが scp を使わずとも簡単にできるようになり、とても便利です。

speedtest

この NanoPi R6S は 2.5GbE の有線 LAN に対応していることがウリなので(もともとルーター用がメインだし…)、ネット回線の速度は測れるようにしておきたいところです。

この手の回線速度測定ツールはいくつかありますが、ここでは speedtest.net が公式に提供している CLI をインストールしてみます。

curl -fsSL https://packagecloud.io/ookla/speedtest-cli/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/ookla_speedtest-cli-archive-keyring.gpg
echo 'deb [signed-by=/usr/share/keyrings/ookla_speedtest-cli-archive-keyring.gpg] https://packagecloud.io/ookla/speedtest-cli/debian/ bullseye main' | sudo tee /etc/apt/sources.list.d/ookla_speedtest-cli.list > /dev/null
sudo apt update
sudo apt install -y speedtest

最初に実行すると初回のみライセンスの同意を求められるので、YES を入力します。
その後、すぐに速度計測が実行されます。私の環境だと最高で下り 700Mbps 以上は出るみたいでした(もちろんネット回線が高速な環境ではもっと出るでしょう)。

この speedtest の CLI 版は毎回サーバーをランダムで選定して通信テストをするのですが、サーバーによってはパケロスが酷いこともあります。少し速度が落ちますが、単にパケロスを避けたいのであれば speedtest -s 24333 で楽天モバイルのサーバーを指定するのがおすすめです。

Tailscale

以前このブログでも紹介した Tailscale VPN 。私の手元のデバイスは原則すべて Tailscale ネットワークに入れて相互に通信できるようにしているので、NanoPi R6S も Tailscale につなげておきたいところです。

curl -fsSL https://tailscale.com/install.sh | sh

以前はインストールする際に apt の sources.list.d に入れたりが必要だったのですが、今は上記の1コマンドでインストールできるようになったようで、便利になったものです(慣れていれば別に Manual Install でもさして手間ではないのですが)。

$ sudo tailscale up

To authenticate, visit:

        https://login.tailscale.com/a/xxxxxxxxxxxxx

Success.

インストールできたら、あとは上記のコマンドで表示される URL をブラウザで開き Tailscale にログインするだけで、自動的に Tailscale のネットワークに接続されます。本当に簡単で良き…。
長期間サーバーとして使う場合は、Disable Key Expires でログインの有効期限を無効化しておくことをお忘れなく。デフォルトだと半年で再ログインが必要になるようです。

Docker のインストール

あんまり使わなさそうな気もしますが、一応 Docker をインストールしてみます。

# GPG 鍵のインポート
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# パッケージリストの登録
cat <<EOF | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable
EOF

# Docker Engine のインストール
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# Docker を sudo をつけなくても操作できるように
# sudo をつけなくても Docker を実行させたいユーザーを docker グループに追加すればいいらしい
# ref: https://docs.docker.com/engine/install/linux-postinstall/
sudo usermod -aG docker pi

# 一度ログアウトしてからログインすれば sudo をつけなくても docker にアクセスできるようになる
exit

手順は上記の通り。

Install Docker Engine on Debian
Learn how to install Docker Engine on Debian. These instructions cover the different installation methods, how to uninst...

インストール手順は基本的には公式ガイドに準じますが、keyring の配置はほかのソフトがだいたい /usr/share/keyrings/ に保存しているので、そっちに統一しています(バランスを取らなくっちゃなァ!)。どっちに保存しようが問題なく動きます。

$ docker version
Client: Docker Engine - Community
 Version:           23.0.3
 API version:       1.42
 Go version:        go1.19.7
 Git commit:        3e7cbfd
 Built:             Tue Apr  4 22:02:03 2023
 OS/Arch:           linux/arm64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          23.0.3
  API version:      1.42 (minimum version 1.12)
  Go version:       go1.19.7
  Git commit:       59118bf
  Built:            Tue Apr  4 22:02:03 2023
  OS/Arch:          linux/arm64
  Experimental:     false
 containerd:
  Version:          1.6.20
  GitCommit:        2806fc1057397dbaeefbea0e4e17bddfbd388f38
 runc:
  Version:          1.1.5
  GitCommit:        v1.1.5-0-gf19387a
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

$ docker compose version
Docker Compose version v2.17.2

Docker と Docker Compose それぞれのバージョンを確認できたら完了です。
ちなみに docker-compose コマンドは最近 docker compose コマンド (Docker Compose V2) として統合されたので、別途インストールする必要はありません。Docker Compose V1 はそろそろ廃止されるはず…。

rkmppenc でハードウェアエンコード

GitHub - rigaya/rkmppenc: Rockchip系SoCのHWエンコーダ(rkmpp)の性能実験
Rockchip系SoCのHWエンコーダ(rkmpp)の性能実験. Contribute to rigaya/rkmppenc development by creating an account on GitHub.
ROCK 5B (RK3588) でhwエンコード ( rkmppenc )
Rock 5BのRK3588 SoCはhwデコーダ・エンコーダを内蔵していて、下記のコーデックに対応している。hwエンコードH.264/HEVChwデコードH.264/HEVC/AV1/MPEG1/MPEG2このデコーダ・エンコーダを試すた...

rkmppenc は QSVEnc や NVEnc で知られる rigaya さんが最近開発された、RK3588 をはじめとした Rockchip 製 SoC に搭載されているハードウェアデコーダー/エンコーダーを利用してハードウェアで高速に動画のエンコードができる素晴らしい CLI ツールです。

CLI 動画変換ソフトといえばみんな大好き FFmpeg です。しかし、FFmpeg は今のところ Rockchip SoC の HW エンコーダーをサポートしていません。HW デコードだけなら一応できるのですが…。

HW デコードだけできてもあまり恩恵ないのでは…?と思ったのですが、どうやら Kodi や VLC などのメディアプレイヤーソフトは動画のデコードに FFmpeg に含まれる映像処理ライブラリの libav (libavcodec など) を利用しているらしく、Rockchip SoC デバイスで動画を再生する際に、libav で HW デコードがサポートされていると CPU を使わずに高速にデコードできて都合が良いみたいです。

一応 HW エンコードに対応させたフォーク もあるにはありますが、少なくとも日本のテレビ放送の録画データ (MPEG-2 Video な MPEG-2 TS) を H.264 / H.265 にトランスコードする用途ではまったく使い物にならなかった…。

一方 rkmppenc を使えば、Rockchip SoC でもほかの QSVEnc シリーズなどと同じようなコマンドライン体系で、高速に動画のハードウェアエンコードができるようになります…!

ラズパイ4以外の ARM SBC (シングルボードコンピューター) でまともに日本のテレビ録画 TS をエンコードできるものは今まで存在しなかったのですが、rkmppenc の登場で世界が変わりました。
デインタレースやリサイズも HW 機能をフル活用してエンコードしてくれるので、CPU をほとんど使わずに、60~80fps 程度で高速にトランスコードできます。MPEG-2 → H.264/H.265 だと少し遅いのですが、H.264 → H.264 であれば 400fps 程度も出るようです。

ちなみに(長らく入手困難な)ラズパイ4は、yadif でデインタレースした上だと HW エンコードでもフル HD 映像をリアルタイムエンコードできないくらいの性能だそうで、いかに RK3588 と Rockchip SoC 内蔵の HW エンコーダーの性能が高いかがよく分かります。
もっとも、ラズパイ4にはライセンスだかの事情で MPEG-2 の HW デコーダーが搭載されていないので(= SW デコード + HW エンコード)比較するのもかわいそうですが…。

rkmppenc が開発されたことで、NanoPi R6S などのRK3588 搭載 SBC は録画サーバーとしてもかなり使えるものになったのでは? 少なくともラズパイ4よりもかなり有望そうに見えます。

インストール手順

rkmppenc/Install.ja.md at master · rigaya/rkmppenc
Rockchip系SoCのHWエンコーダ(rkmpp)の性能実験. Contribute to rigaya/rkmppenc development by creating an account on GitHub.
# Rockchip MPP のインストール
## rockchip-multimedia-config は Rockchip のハードウェアエンコーダーを有効化するための設定パッケージ
wget https://github.com/tsukumijima/mpp/releases/download/v1.5.0-1-88d73be/librockchip-mpp1_1.5.0-1_arm64.deb
sudo apt install -y --allow-downgrades ./librockchip-mpp1_1.5.0-1_arm64.deb
rm librockchip-mpp1_1.5.0-1_arm64.deb
wget https://github.com/tsukumijima/rockchip-multimedia-config/releases/download/v1.0.2-1/rockchip-multimedia-config_1.0.2-1_all.deb
sudo apt install -y ./rockchip-multimedia-config_1.0.2-1_all.deb
rm rockchip-multimedia-config_1.0.2-1_all.deb

# librga のインストール
wget https://github.com/tsukumijima/librga/releases/download/v2.2.0-1-edc2572/librga2_2.2.0-1_arm64.deb
sudo apt install -y --allow-downgrades ./librga2_2.2.0-1_arm64.deb
rm librga2_2.2.0-1_arm64.deb

# Mali GPU Driver のインストール (RK3588/RK3588S 向け)
## --vpp-yadif などの OpenCL フィルタの利用に必要
## Debian 11 Bullseye Core イメージにはデフォルトではインストールされていない
## 他の Rockchip SoC の Mali GPU Driver は https://github.com/tsukumijima/libmali-rockchip/releases から入手できる
## RK3588/RK3588S の場合、g610-g6p0 より g610-g13p0 の方が高速に動作する
wget https://github.com/tsukumijima/libmali-rockchip/releases/download/v1.9-1-2d267b0/libmali-valhall-g610-g13p0-wayland-gbm_1.9-1_arm64.deb
sudo apt install -y --allow-downgrades ./libmali-valhall-g610-g13p0-wayland-gbm_1.9-1_arm64.deb
rm libmali-valhall-g610-g13p0-wayland-gbm_1.9-1_arm64.deb

# rkmppenc のインストール
## できるだけ最新版をインストールすることを推奨
## 最新版の deb パッケージは https://github.com/rigaya/rkmppenc/releases から確認できる
wget https://github.com/rigaya/rkmppenc/releases/download/0.05/rkmppenc_0.05_Ubuntu20.04_arm64.deb
sudo apt install -y --allow-downgrades ./rkmppenc_0.05_Ubuntu20.04_arm64.deb
rm rkmppenc_0.05_Ubuntu20.04_arm64.deb

インストール方法は上記のドキュメントに準じます。

$ rkmppenc --check-hw
Supported Encode Codecs
H.264/AVC
H.265/HEVC

$ rkmppenc --check-mppinfo
SoC name        : friendlyelec,nanopi-r6s rockchip,rk3588
Mpp service     : yes [mpp_service_v1] (okay)
Mpp kernel      : 5.10
2D accerelation : iepv2(okay) rga(okay)
HW Encode       : H.264/AVC H.265/HEVC
HW Decode       : H.264/AVC(10bit) H.265/HEVC(10bit) MPEG2 VP9(10bit) AV1

$ rkmppenc --check-rgainfo
rga_api version 1.9.1_[4]
RGA (/dev/rga) avail  : yes
RGA status            : okay
RGA vendor            : Rockchip Electronics Co.,Ltd.
RGA_api version       : v1.9.1_[4]
RGA version           : RGA_2_Enhance RGA_3
Max input             : 8192x8192
Max output            : 8128x8128
Byte stride           : 16 byte
Scale limit           : 0.0625 ~ 16
Input support format  : RGBA_8888 RGB_888 RGB_565 RGBA_4444 RGBA_5551 YUV420_sp_8bit YUV420_sp_10bit YUV420_p_8bit YUV420_p_10bit YUV422_sp_8bit YUV422_sp_10bit YUV422_p_8bit YUV422_p_10bit YUYV422 YUV400/Y4
output support format : RGBA_8888 RGB_888 RGB_565 RGBA_4444 RGBA_5551 YUV420_sp_8bit YUV420_sp_10bit YUV420_p_8bit YUV422_sp_8bit YUV422_sp_10bit YUV422_p_8bit YUYV420 YUYV422 YUV400/Y4
expected performance  : max 4 pixel/cycle

$ rkmppenc --version
rkmppenc (aarch64) 0.00 (r140) by rigaya, Apr 25 2023 11:12:29 (gcc 9.4.0/Linux)

インストールが終わったら、HW エンコーダーが認識されているかを確認してみましょう。

rkmppenc は、RK3588 (RK3588S) SoC では H.264/AVCH.265/HEVC の2つのコーデックへの HW エンコードに対応しています。HW デコードでは、日本のテレビ放送で使われている MPEG-2 、H.264/AVC 、H.265/HEVC に対応しています。

さらに、--vpp-deinterlace オプションを使うことで、IEP と呼ばれる内蔵ハードウェアでインターレース解除を行えます!また、映像のリサイズも RGA と呼ばれる内蔵ハードウェアで高速に行えます。

それ以外の –vpp 系オプションも OpenCL を使い GPU で処理されるようになっているため、CPU をほとんど使わずに高速にエンコードできます。もっとも、RK3588 は CPU 性能がかなり高いためソフトウェアエンコードもある程度できてしまうのですが…。
上の画像は、1440×1080 の映像を 1920×1080 にリサイズするエンコードプロセスを2つ同時に走らせた際の CPU 使用率です。全体的にかなり CPU 負荷を抑えられていることがわかります。

コマンド例

下記は rkmppenc のコマンド例です。参考にしてください。
コマンド体系は QSVEncC / NVEncC / VCEEncC とほぼ同じなので、それらのエンコーダーを使っている方にとっては馴染みやすいと思います。

MPEG-2 Video (60i) → 1920×1080 H.264 (High) 30p (インタレース解除あり)

rkmppenc -i ./input.ts --avhw --codec h264 --profile high --preset best \
  --interlace tff --vpp-deinterlace normal_i5 --vbr 6500K --output-res 1920x1080 --dar 16:9 \
  --audio-codec aac --audio-bitrate 192K -o ./output_h264_normal.mp4

MPEG-2 Video (60i) → 1920×1080 H.264 (High) 60p (インタレース解除あり)

rkmppenc -i ./input.ts --avhw --codec h264 --profile high --preset best \
  --interlace tff --vpp-deinterlace bob_i5 --vbr 6500K --output-res 1920x1080 --dar 16:9 \
  --audio-codec aac --audio-bitrate 192K -o ./output_h264_bob.mp4

MPEG-2 Video (60i) → 1920×1080 H.265 (Main) 30p (インタレース解除あり)

rkmppenc -i ./input.ts --avhw --codec h265 --profile main --preset best \
  --interlace tff --vpp-deinterlace normal_i5 --vbr 6500K --output-res 1920x1080 --dar 16:9 \
  --audio-codec aac --audio-bitrate 192K -o ./output_h265_normal.mp4

MPEG-2 Video (60i) → 1920×1080 H.265 (Main) 60p (インタレース解除あり)

rkmppenc -i ./input.ts --avhw --codec h265 --profile main --preset best \
  --interlace tff --vpp-deinterlace bob_i5 --vbr 6500K --output-res 1920x1080 --dar 16:9 \
  --audio-codec aac --audio-bitrate 192K -o ./output_h265_bob.mp4

コメント