created: 2022-10-22T08:05:35.107Z
[2022年度版][Mirakurun + EPGStation] Raspberry Pi で mp4 のエンコードにハードウェアアクセラレータを使うまで
もともとはこちら(本家)の docker-compose.yml 下敷きに作業しようとしていた。 ただし、これは RaspberryPi で動作させる想定でないので持ってくるイメージなどで一手間必要になる。
EPGStation の Dockerfile(h264_omxコーデックが有効なffmpegをビルドする部分)はこちらを参考にしようとしたが、これも2022年ではそのままでは動作しなくなっていた。
追加で対応が必要だった部分をメモしていく。
/opt/vc/lib/ 配下のインストール
/opt/vc/lib/
配下のライブラリが入っていない。これを入れた状態で ffmpeg をビルドして配置しておく必要がある。
$ git clone http://github.com/raspberrypi/userland.git /tmp/userland && cd $_
$ ./buildme
インストールしておかないとエンコード時にこのようなエラーでコケる。
[h264_omx @ 0x37c9180] /opt/vc/lib/libbcm_host.so not found
なお、去年以前の記事だとこのワークアラウンドに言及しているものが出てこない。Raspbian のアップデートのせいなのかわからないが、過去の記事では apt で ffmpeg を入れただけで h264_omx コーデックが使えるみたいな書き方になっているものがほとんどなので、これを調べているとき「自分がなんか変なことしてるんだろうか」と思っていた。
「sudo rpi-update
を叩いおくとこのエラーは回避できる」みたいな記述も後から見つけたけど試していない。しかしこれで解消するのは libEGL.so not found
だけかも。
参考
- raspberrypi/userland: Source code for ARM side libraries for interfacing to Raspberry Pi GPU.
- 【ffmpeg】ラズパイでh264_omxエンコードできないときは… - Qiita
vchiq を触れるように
udev 配下のパーミッションを変更しておく必要がある。
echo 'SUBSYSTEM=="vchiq",GROUP="video",MODE="0666"' \
| sudo tee /etc/udev/rules.d/10-vchiq-permissions.rules
# 変更した後の再起動も必要
これをしておかないとエンコード時にこんなエラーメッセージでコケる。
- failed to open vchiq instance
参考
- FFmpegでH.264のハードウェアエンコードができるようにする | Raspberry Pi 4とDockerで作る小型録画サーバー(ハードウェアエンコード対応)
- udevルールの書き方 - hana_shinのLinux技術ブログ
arib_caption not found
ffmpeg v4.2 からは字幕が付帯した動画をエンコードしたい場合はライブラリを入れる必要がある。
$ apt install libaribb24-dev
ffmpeg のビルド時のオプションにこれが必要。
--enable-version3
--enable-libaribb24
これはエンコードの設定によるが、字幕ごとエンコードしようとするとこんなエラーメッセージでコケる。
Decoder (codec arib_caption) not found for input stream #0:2
デフォルトのエンコードコマンドは字幕が有効(-map 0:s? -c:s mov_text
)となっているし、これが入ったffmpegを使って運用するほうが後顧の憂いが無いと思う。
参考
update programs error
これはハードウェアアクセラレーションと関係ないが、必要な対応がまとまってると後で(自分が)楽なのでメモ。
MySQLの文字コードが原因でEPGStationアプリが録画に失敗する。
[INFO] system - start update programs [ERROR] system - update programs error
基本的にはここに書いてある通りにすればよさそうではある。
が、自分の手元だとどうしても明示的にデータベースの文字コードを指定しないと動くようにならなかった。
$ sudo docker compose exec -u root mysql /usr/bin/mysql -uroot -pepgstation epgstation \
-e "DROP DATABASE IF EXISTS epgstation; CREATE DATABASE epgstation CHARACTER SET utf8mb4;"