2024年2月24日土曜日

µStreamerをラズパイZero Wで動かしてみた。

 ラズパイZero WにUSBカメラを繋いでリアルタイムストリーミングをやってみた。前回BBBlueで試したときかなり低遅延でCPU負荷も軽かったし、mjpg-streamerは更新されていないっぽいのでuStreamerを使ってみる。

久しぶりにRaspberry Pi Zero Wを引っ張り出してきたらOSのアップデートが大変そうだったので新規インストールすることに。

Raspberry Pi Imagerを使ってRaspberry Pi OS Lite(32bit)のBookwormをインストール。あらかじめWiFi設定やSSHの有効化ができるので最近は便利だなぁ。

dtoverlay=sdtweak,overclock_50=100

とりあえずsudo nano /boot/firmware/config.txtでSDカードオーバクロックだけ追加した。

ustreamerはapt-getからもインストールできたりするんだけど、バージョンが古いらしくフォーラムとかを見ていてもビルドを推奨されてるようだったのでビルドしてみた。GPUアクセラレーションのM2Mとかを使う場合もビルドしたバージョンじゃないと対応してないみたいだし。

sudo apt-get install libevent-dev libjpeg62-turbo-dev libbsd-dev git
git clone --depth=1 https://github.com/pikvm/ustreamer
cd ustreamer
make
sudo make install

とりあえずこんな感じで5分ぐらいでビルドできた。

インストールが終わったらカメラを接続してテスト。このuStreamerだとカメラ側のハードウェアエンコーダーをそのまま使えたりするので、カメラの情報を確認する。

v4l2-ctl --list-formats-ext

このコマンドで今接続してるカメラの対応してるフォーマットと解像度が一覧で見れる。

Logicool C270を接続してみたんだけど、このカメラの場合はYUYVとMotion-JPEGに対応していた。ということでuStreamerでMotion-JPEGを使って配信してみる。

ustreamer -m MJPEG -f 30 -s 0.0.0.0 -p 8080

これで640x480の30fpsでストリーミングを開始できる。ブラウザからhttp://ラズパイのIP:8080にアクセスして/streamをクリックするとストリーミングを確認することができる。

画面にストップウォッチとストリーミング映像を並べて表示してカメラでストップウォッチを撮影してスクリーンショットするという手法で遅延を測ってみた。

WiFiルータにラズパイZero Wの内蔵無線LAN経由で接続して廊下を挟んで隣の部屋のルータにつながっているけど遅延0.16秒ぐらいでサクサク動く。

ラズパイZero WでもustreamerのCPU使用率は5%ぐらいでほぼ負担がかかっていない。UVCのkworkerも3%ぐらいだし。カメラのハードウェアエンコーダに頼っているのでラズパイZero W側ので処理はHTMLでデータを流すだけだし。

ちなみにHD解像度でも試してみた。

ustreamer -m MJPEG -f 30 -s 0.0.0.0 -p 8080 -r 1280x720

これで1280x720のワイドな解像度で配信できる。

遅延も相変わらず約0.16秒。ワイドだとより視野角が増えてロボットに乗せるのには良さそう。ちなみにこの遅延、前回試したところによるとカメラ側の性能にも左右されるのでもっと速いカメラもあるかも?手持ちの中ではLogicoolのC270とC310が一番良かった。(C310のほうが0.01~0.02秒ぐらい速いことも)

このぐらいの低遅延で映像が送れてCPU側の負担も少ないので動く系のロボットとかで使えそう。他の処理にCPUとメモリを割り当てられるし。帯域は解像度によるけど、あんまり多くない。音声が送れないのが少し残念な点かもしれない。


0 件のコメント:

コメントを投稿