この記事はギークフィードアドベントカレンダー2023の6日目の記事です。
https://qiita.com/advent-calendar/2023/geekfeed
目次
はじめに
こんにちは、geekfeedのwadaです。
普段はYouWireというソフトウェアの開発にかかわっているのですが、業務外ではRaspiなどのハードウェア関係のものも触ることも多いです。
本記事では、Raspiを使ったIoTの定番として映像のストリーミングをしたいと思います。
映像のストリーミングをすると、ネットワークにつながっていれば遠隔からでいろいろなものを監視できたりするので結構楽しいです。
私は観葉植物を観察したりしています。
前提
以下の2つができることが前提です。
1.ラズパイにアクセスできること
2.カメラモジュールがあること
手順
1.カメラデバイスの接続確認
以下のコマンドでカメラデバイスの状態を確認できます。
1 2 |
$ vcgencmd get_camera supported=1 detected=1, libcamera interfaces=0 |
detected = 0 |
detected = 1 |
|
supported = 0 |
カメラポートが有効化されていない ( raspi-config を設定 ) |
|
supported = 1 |
カメラモジュールが正しく認識できていない | 正しく認識されている |
2.使用デバイスの確認
v4l2-ctl
コマンドでカメラモジュールに割り当てられているデバイスファイルを確認することができます。v4l2-ctl
とは、Video for Linux 2(V4L2) APIを使用してビデオデバイスを制御するためのユーティリティです。V4L2は、Linuxカーネルでビデオデバイス(ウェブカメラ、TVチューナーなど)を操作するためのAPIです。v4l2-ctl
は、このAPIを使用してデバイスの設定や状態の確認を行うためのコマンドラインツールです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ v4l2-ctl --list-device bcm2835-codec-decode (platform:bcm2835-codec): <= ハードウェアエンコーダ /dev/video10 /dev/video11 /dev/video12 /dev/video18 bcm2835-isp (platform:bcm2835-isp): <= ハードウェアアクセラレータ /dev/video13 /dev/video14 /dev/video15 /dev/video16 mmal service 16.1 (platform:bcm2835-v4l2-0): <= カメラモジュール /dev/video0 |
この場合、 /dev/video0
というファイルにカメラモジュールが割り当てられていることがわかります。
3.デバイスの性能確認
上記で調べたデバイスファイルを以下のように指定することで
v4l2-ctl -d /dev/video --list-formats
カメラの対応コーデック、解像度、fpsなどが確認できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
$ v4l2-ctl -d /dev/video0 --list-formats-ext ioctl: VIDIOC_ENUM_FMT Type: Video Capture [0]: 'YU12' (Planar YUV 4:2:0) Size: Stepwise 32x32 - 2592x1944 with step 2/2 [1]: 'YUYV' (YUYV 4:2:2) Size: Stepwise 32x32 - 2592x1944 with step 2/2 [2]: 'RGB3' (24-bit RGB 8-8-8) Size: Stepwise 32x32 - 2592x1944 with step 2/2 [3]: 'JPEG' (JFIF JPEG, compressed) Size: Stepwise 32x32 - 2592x1944 with step 2/2 [4]: 'H264' (H.264, compressed) Size: Stepwise 32x32 - 2592x1944 with step 2/2 [5]: 'MJPG' (Motion-JPEG, compressed) Size: Stepwise 32x32 - 2592x1944 with step 2/2 [6]: 'YVYU' (YVYU 4:2:2) Size: Stepwise 32x32 - 2592x1944 with step 2/2 [7]: 'VYUY' (VYUY 4:2:2) Size: Stepwise 32x32 - 2592x1944 with step 2/2 [8]: 'UYVY' (UYVY 4:2:2) Size: Stepwise 32x32 - 2592x1944 with step 2/2 [9]: 'NV12' (Y/CbCr 4:2:0) Size: Stepwise 32x32 - 2592x1944 with step 2/2 [10]: 'BGR3' (24-bit BGR 8-8-8) Size: Stepwise 32x32 - 2592x1944 with step 2/2 [11]: 'YV12' (Planar YVU 4:2:0) Size: Stepwise 32x32 - 2592x1944 with step 2/2 [12]: 'NV21' (Y/CrCb 4:2:0) Size: Stepwise 32x32 - 2592x1944 with step 2/2 [13]: 'RX24' (32-bit XBGR 8-8-8-8) Size: Stepwise 32x32 - 2592x1944 with step 2/2 |
この場合は、カメラがh.264コーデックに対応していることがわかります。
一般に、市販のwebカメラはPC側でエンコードする前提で設計されているものが多いので、カメラ側に h.264ハードウェアエンコーダを搭載していません。しかし、h.264コーデックに対応したものであれば、raspiの負荷が少なくなると思われます。
4.ストリーミング開始
以下のコマンドで映像をストリーミングできます。
1 |
raspivid -t 0 -w 800 -h 600 -ifx none -fps 30 -l -o 'tcp://0.0.0.0:5000' |
ストリーミングする際のFPSに関して、一時的な動作を確認する防犯カメラ的な用途であれば3~5fps、AIなどの物体検知をしたい場合は10~30fpsが必要だといわれています。このコマンドでは30 fpsに設定しています。
5.外部からの接続
vlcメディアプレイヤーを使う場合は以下のコマンドで動画を取得できます。
1 |
vlc 'tcp/h264://ipaddress:port' |
これでネットワークにアクセスできれば動画を見ることができるようになりました。
終わりに
クライアントを強制終了するとストリーミングが終了する
raspivid
の問題だと思うのですが、クライアントの接続を強制的に切ったり、長時間映像をストリーミングしていると raspivid
が終了するようです。
どちらのエンコーダが使われているのかわからない
Raspberry PIはPico以外のすべてのモデルにH.264ハードウェアエンコーダを搭載しているようです。カメラモジュールにもエンコーダが搭載されている場合はどちらのエンコーダが使われるのかわからなかったです。
これに関しては raspivid
のマニュアルを調べたり、 v4l2-ctl
でデバイスの状態を詳しく調査すればわかると考えています。
- ラズパイで映像をストリーミングしてみた - 2023-12-06