タヒチ モーレア島の夕日

エデン

それはまだ見ぬ自律航行型の水上ヴィラ

Raspberry Piでカメラ映像をストリーミングする

ラジコンボートエデンをリモートで操縦するには、やはりカメラの映像が欲しいですよね。そこで、Raspberry Piにカメラモジュールを繋いでストリーミングしようと思います。

今回使うのは本家のカメラモジュールv3です。Amazonなどでは互換性のある様々なカメラが売られていますが、なぜかここは『痛い目見てなんぼ』の精神が働きませんでした。管理人のアダム的には「やっぱりカメラセンサーといえばソニーだよね」と思っています。

当初、mjpg-streamerを使おうと思って色々と試行錯誤したんです。色々とライブラリを入れたり、色々とmakeしたり・・・。なかなかうまくいかないなぁと思ってしばらく悩んだ結果、bullseyeからライブラリが変わったという情報があるじゃないですか。しかも配信まで標準コマンドでできる様で。相変わらずよく調べずにとりあえず行動を始めてしまうのは悪い癖ですね・・・。まぁ仕事の面では考えて止まるよりも行動が早い方が良い場合が多いのですが。

VLCのインストール

VideoLANのサイトからダウンロードします

インストールは特に悩む事なくポチポチ進むと思います。

Raspberry Piでカメラが認識しているかどうかは、このコマンドで確認できます。

libcamera-vid --list-cameras

出力結果はこんな感じ。

Available cameras
-----------------
0 : imx708 [4608x2592] (/base/soc/i2c0mux/i2c@1/imx708@1a)
    Modes: 'SRGGB10_CSI2P' : 1536x864 [120.13 fps - (768, 432)/3072x1728 crop]
                             2304x1296 [56.03 fps - (0, 0)/4608x2592 crop]
                             4608x2592 [14.35 fps - (0, 0)/4608x2592 crop]

Raspberry Piから配信するときはこんな感じ。

libcamera-vid -t 0 --inline --listen -o tcp://0.0.0.0:8888 --rotation 180 --buffer-count 0 --width 1280 --height 720 -v 0

パラメータを一部解説

-t 0
タイムアウト値。デフォルトで5000ms。クライアントが接続してこの時間が経過すると自動的に終了します。今回はストリーミングしたいので、0(タイムアウトしない)に設定します。

–inline
H.264ビデオコーデックでは、Iフレームと呼ばれる静止画像と、Pフレームと呼ばれる差分フレームが交互に送信されます。Pフレームは前のフレームに対する変更情報のみを含み、Iフレームに比べてサイズが小さくなります。PPS(Picture Parameter Set)およびSPS(Sequence Parameter Set)は、H.264ビデオストリーム内のヘッダー情報の一部であり、コーデックに関する情報を提供します。これらの情報は、ストリームのデコードに必要であり、動画ストリームの再生に必要な最小限の情報としてサーバーによってクライアントに送信されます。このオプションは、Iフレームの前に強制的にPPSおよびSPSヘッダーを送信することを指示します。これにより、ストリームの再生を開始する前に必要な情報がすべて揃い、より速い再生が可能になります。しかし、PPSおよびSPSヘッダーを送信するたびにデータ量が増加するため、帯域幅の制限がある場合は注意が必要です。
つけないと再生までの時間がかかりますが、再生後の遅延は少ないように感じます。外そうかな・・・。

–rotation 180
画像を180度ほど回転させます。カメラの向きに合わせて、必要に応じて。

–buffer-count 0
送信バッファーのサイズ。バッファーをある程度大きくすると滑らかになる。今回は滑らかさよりも遅延の少なさを優先したいので0を指定しました。が、よく見たらデフォルトで0なので指定する必要はなかったです。

–width 1280 –height 720
送信する画角です。デフォルトだと640×480。カメラモジュールv3の最大は4608×2592です。1920×1080くらいまで大きくすると、遅延というか途中で固まって少し時間が経ってから一瞬復帰してまた固まるような動作をします。回線スピードなどにもよると思いますので、要チューニングです。ただ、指定したサイズに『縮小』してくれるわけではなく、切り抜きされるので、小さめの値を設定しても画質が荒く感じることは無いです。

-v 0
インフォメーションテキストの出力を止めます。デフォルトは1で、『%frame (%fps fps) exp %exp ag %ag dg %dg』という書式(–info-text オプションのデフォルト値)がコンソールの標準エラー出力(ファイルディスクリプタの2番)に出てきます。当初は『2> /dev/null』として捨てていましたが、このオプションに気づいてこちらに変えました。元から止めたほうがちょっとは負荷が下がるはず・・・。

表示するVLCプレイヤー側では、『メディアを開く⇒ネットワークを開く』と進んで以下のように入力します。

tcp/h264://raspberrypi.local:8888

詳細オプションでキャッシュを0msに変更しました。これで多少遅延が減ります。

まぁなんとも簡単に配信できちゃいますね。RaspberryPiの進化がすごいです。


Posted

in

,

by

Tags: