【7-1】RaspberryPiから低遅延で映像を飛ばす
映像を飛ばすだけなら、そう難しくありませんが
ラジコンの映像となると、遅延が問題になります。
raspivid等標準の機能では、1~5秒程度の遅延が出るため
間違いなく事故ります。
ここでは、WebRTCを使用した低遅延配信でおなじみ
OpenAyameを使った映像の受取を作ります。
目次
- 【1】Raspberry pi の、GPIOをTypescriptから操作
- 【2】DCモーターをPWMで速度制御
- 【3】サーボモーターを制御
- 【4】DualSenseをブラウザに接続
- 【5】DualSenseの情報をRaspberryPiに飛ばす
- 【6】DualSenseのチャタリング?問題対応
- 【7-1】RaspberryPiから低遅延で映像を飛ばす
- 【7-2】RaspberryPiから低遅延で映像を飛ばす
- 【8】ThreeJSでVRもどきを作成
- 【9-1】iPhoneの加速度から頭の向きをVRに反映
- 【9-2】スマホVRゴーグル向けデザインに変える
- 【10】ラジコン本体の製作
- 【11】パワーアップとバッテリー問題の解決
カメラの接続
使用するカメラ
RaspberryPiにUSBで繋ぐ時によくでてくる、このカメラを使用します。
購入時期が6年ほど違いますが、logicoolのc270nと同等品です
接続確認
オマジナイのようにデバイスが認識されているか確認します。
Bus 001 Device 004: ID 046d:0825 Logitech, Inc. Webcam C270 ← コレ
Bus 001 Device 003: ID 0424:ec00 Microchip Technology, Inc. (formerly SMSC) SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Microchip Technology, Inc. (formerly SMSC) SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
ここに出てこないと、面倒なので使えないと思ったほうが良いです。
対応フォーマットの確認
カメラが対応している映像フォーマットを確認します。
下の方の解像度情報は省いています。
概ねQVGA相当で30fps出せるのと、YUYVに対応しているので
RaspberryPiのハードウェアエンコーダーでh264に変換できます。
$ v4l2-ctl --list-formats-ext --device=/dev/video0
ioctl: VIDIOC_ENUM_FMT
Type: Video Capture
[0]: 'YUYV' (YUYV 4:2:2)
Size: Discrete 1280x720
Interval: Discrete 0.133s (7.500 fps)
Interval: Discrete 0.200s (5.000 fps)
Size: Discrete 1280x960
Interval: Discrete 0.133s (7.500 fps)
Interval: Discrete 0.200s (5.000 fps)
[1]: 'MJPG' (Motion-JPEG, compressed)
Size: Discrete 1280x720
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.067s (15.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Interval: Discrete 0.200s (5.000 fps)
Size: Discrete 1280x960
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.067s (15.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Interval: Discrete 0.200s (5.000 fps)
momoのセットアップ
OpenAyaneを利用するのに、momoが必須になるのでセットアップを行います。
WebRTCで映像を受け取るだけであれば、momoだけで十分ですが
後に控える、iPhoneの加速度取得がhttps必須のため
wss対応のシグナリングサーバー経由で接続する、OpenAyameを使用する事になります。
シグナリングサーバー自体を作るのは、難しくありませんので
クローズドな環境で構築する必要がある場合でも、対応は可能です。
依存パッケージインストール
ここからは、RaspberryPi側で作業を行います。
基本手順は公式のRaspberryPiのセットアップドキュメントを参考に行います。
まずは定番の依存ライブラリの追加
sudo apt install libnspr4 libnss3
sudo apt install libcamera0.3
sudo apt install libxtst6
sudo apt install libegl1-mesa-dev
sudo apt install libgles2-mesa
不足ライブラリをビルド
momoが参照するライブラリが一部非推奨になっているようで
ソースからビルドする必要があります。
これ以外でメンテナンスされたライブラリを取得する方法が見つけられなかったため
記載の内容で進めていますが、メンテナンスバージョンがあるなら
そちらを使って下さい。
ビルド環境の準備
cmake追加
sudo apt install cmake
userlandプロジェクトをclone
ビルドで使うディレクトリを作ります。
cd ~
mkdir -p git/raspberrypi
cd git/raspberrypi
プロジェクトをCloneします。
git clone http://github.com/raspberrypi/userland.git
cd userland/
ls
buildme containers host_applications interface makefiles opensrc README.md vcinclude
CMakeLists.txt helpers host_support LICENCE middleware pkgconfig vcfw
uselandをビルド
何かWarning出たりしますが、気にせず最後まで進めると
恐らく必要なライブラリファイルが生成できているはずです。
./buildme
ライブラリのリンクを作成
momoの参照先にリンクを張ります。
sudo ln -fs /opt/vc/lib/libbcm_host.so /usr/lib/libbcm_host.so.0
sudo ln -fs /opt/vc/lib/libvcos.so /usr/lib/libvcos.so.0
sudo ln -fs /opt/vc/lib/libvchiq_arm.so /usr/lib/libvchiq_arm.so.0
sudo ln -fs /opt/vc/lib/libcontainers.so /usr/lib/libcontainers.so.0
sudo ln -fs /opt/vc/lib/libvcsm.so /usr/lib/libcontainers.so.0libvcsm.so
sudo ln -fs /opt/vc/lib/libvcsm.so.0 /usr/lib/libvcsm.so.0
sudo ln -fs /opt/vc/lib/libvcsm.so /usr/lib/libvcsm.so.0
sudo ln -fs /opt/vc/lib/libmmal.so /usr/lib/libmmal.so.0
sudo ln -fs /opt/vc/lib/libmmal_core.so /usr/lib/libmmal_core.so.0
sudo ln -fs /opt/vc/lib/libmmal_components.so /usr/lib/libmmal_components.so.0
sudo ln -fs /opt/vc/lib/libmmal_util.so /usr/lib/libmmal_util.so.0
sudo ln -fs /opt/vc/lib/libmmal_vc_client.so /usr/lib/libmmal_vc_client.so.0
monoセットアップ
momo自体のセットアップを行います。
rootディレクトリのほうが良いという記事を見て、猿真似で実行していますが
試した限りでは別のディレクトリでも動きます。
- コントローラーの制御を行うWebSocketサーバー
- WebRTCで映像配信を行うWebRTCサーバー
最終的に2つのサーバーがそれぞれ別で動きますので
WebSocket側とディレクトリが別れていれば、問題ありません。
rootディレクトリに移動
cd /
monoプロジェクトを取得
arm7対応のmomoが必要になりますので
2年ほど前のビルドを落とす必要があります。
・shiguredo/momo
https://github.com/shiguredo/momo/releases
sudo wget https://github.com/shiguredo/momo/releases/download/2023.1.0/momo-2023.1.0_raspberry-pi-os_armv7.tar.gz
プロジェクトの展開と実行ファイル移動
sudo tar zxvf momo-2023.1.0_raspberry-pi-os_armv7.tar.gz momo-2023.1.0_raspberry-pi-os_armv7/
sudo mv momo-2023.1.0_raspberry-pi-os_armv7/* ./
テストモードで試験視聴
下記コマンドを実行すると
- カメラデバイス「/dev/video0」を使用
- ハードウェアエンコーダを使用した配信
が始まります。
sudo ./momo --no-audio-device test
コマンド実行時に、何も表示されなければ恐らく動いています。
実行後、RaspberryPiのIPアドレスが192.168.10.11で作業を行っていますので
ブラウザから「http://192.198.10.11:8080/html/test.html 」にアクセスると
テスト画面から映像配信が受信できるかを確認できます。
映像が表示され
実際にほぼリアルタイムで映像が配信されます。
UZAYA
Uzayaでは、多分仕事を求めています。
何かの役に立ちそうでしたら、是非お知らせを。