ほぼ無料で作れる低遅延 0.1秒(100ms)カメラ映像伝送システムの作り方を紹介-GStreamer編 1対1の低遅延映像

ジュエ株式会社の技術部です。ほぼ無料で作れる1対1の超低遅延0.1秒(100ms)カメラシステムの作り方を紹介します。各産業向けの超低遅延カメラシステムは、それなりの金額になるでしょう。低遅延カメラシステムを検証したいけど予算が無い。。。という方はお試しください。持っているパソコン2台を使う前提になりますが、数百分の1ぐらいの費用で作れるかもしれません。

0.1秒(100ms)の遅延であれば、実証実験に使える低遅延です。遅延に関しては、カメラ映像出力の遅延、送信側と受信側のシステム間の遅延、モニターの遅延、無線や有線やサーバなどインターネット間の遅延、映像のエンコードやデコードなどさまざまな要素がありますが、本記事では、詳しく分析しません。測定もざっくりです。今回の0.1秒(100ms)遅延は、カメラから受信側モニターに表示されるまで遅延です。そこが分かればOKでしょう。

Zoomなどオンラインミーティングソフトウェアは、300ms~ぐらいの遅延です。ジャンケンできる遅延が150msといわれ、一般的な機器の操作なら100~200msあれは操作はできるでしょう(※手術や車操縦など特殊な環境では30ms~50msなどが必要かもしれません)。30fpsのカメラの場合、1フレームが33msです。つまり3~4フレーム程度の遅延で映像を見ることができます。100msで映像が見れれば、だいたいの目的に利用できるのではないでしょうか。

NDIを使った1対多の低遅延映像の記事もアップしました。

ほぼ無料で作れる低遅延 0.3秒(300ms)カメラ映像伝送システムの作り方を紹介-NDI編 1対多の低遅延映像
https://jouer.co.jp/ndi-network-camera/

 

ここから広告

より低遅延で多機能な低遅延VRカメラシステム

ジュエ株式会社では、VRカメラから遠隔地のモニター表示までが50ms以下(実測41.5ms)という、極めて低遅延なVRシステムを販売しています。低遅延でかつVR3D立体視で映像を見ることができます。

詳しくはこちら極低遅延3D立体視VRカメラシステム「RoboScope ZeroDelay」
https://jouer.co.jp/news/roboscope-zerodelay/

ここまで広告


 

使用するUSBカメラは、ELPというAmazonで8000円ぐらいで購入できるUSBカメラです。私物です。家にこのカメラが7個ぐらいあります。USB2.0接続ELP1080P@30fpsの170°レンズがついたタイプを使います。赤外線もついているので夜でも見えます。レンズを回すことでフォーカスも近接に出来たりします(分解が必要なタイプもあります)。

さまざまなタイプがあり、さまざまな出品者から販売されていますので、吟味して探してください。Amazonの場合はELPCCTVがダイレクトストアっぽいので、そちらから購入がよさそうです。このカメラを利用すれば、Windows PCであれば、ほぼ同じコマンドで動作するかと思います。自己責任でお買い求めください。

 

低遅延映像へさまざまなアプローチ

映像を送るためによく使われるのは、OBSやffmpegです。ライブ配信でよく使われるプロトコルはRTMPです。遅延が10~5秒ぐらいあります。視聴のためにHLSを使うと30秒~60秒ぐらいです。ライブ配信では未だにRTMPが主流です。RTMPの代わりにSRTを使えば、1秒ぐらいに低遅延になり低遅延のHLSを使えば、2~3秒(2000~3000ms)で配信できます。このあたりをはじめに検証されると思います。これらは一般的なライブ配信向け(たくさんの人が見る)であり、低遅延カメラシステムには適していません。

WebRTCを選ぶ人も多いでしょう。私はWebRTCには詳しくないため間違っているかもしれません。Zoomのような少し多人数で、アプリやブラウザーを使い低遅延で会話をする仕組みに適していると考えています。サーバやアプリ開発に強い人には適切かもしれません。高解像度や画質を求めるとフレームが落ちたりする印象があります。

NDIは、放送業界向けのIP伝送ですが、何気に低遅延な映像送信に適しています。WebRTCのように複数からも見れます。別途記事にする予定です。

いろいろな方式があるのですが今回はGStreamerを使います。GStreamerは、フリーソフトウェアでありLGPLのため組み込みなどに利用しやすいです。プロトコルはUDP(RTP)を使います。1対1で低遅延な映像を送信します。送信側はノートパソコンで、OSはWindows 10を使います。

 

GStreamerセットアップ

GStreamerの公式ダウンロードページ(https://gstreamer.freedesktop.org/download/)にアクセスし、Windows向けのインストーラを「MinGW 64-bit」を選択します。

例:1.22.3 runtime installer

インストーラでインストールします。適宜選択して進めます。

Typicalでも問題ないと思いますが、全部入りのCompleteを選択します。

通常は、Cドライブにgstreamerのフォルダーがインストールされると思います。gstreamerのフォルダーがどこにあるか確認してください。※環境によっては別のドライブにインストールされることもあります。

例:
C:\gstreamer\1.0\mingw_x86_64\bin

「C:\gstreamer\1.0\mingw_x86_64\bin」フォルダーの存在が確認できたら、次に「システム環境変数の編集」でパスを設定する必要があります。「システム環境変数の編集」とWindowsの検索窓へ入力すると出てきます。

「環境変数」をクリックします。

「Path」をクリックします。

新規をクリックして、先ほど確認した「C:\gstreamer\1.0\mingw_x86_64\bin」を入力してOKを押し設定を保存します。

システム環境変数も確認します。インストールすると自動で入力されていたと思いますが、記憶が定かでありません。もし設定がなければ、「C:\gstreamer\1.0\mingw_x86_64\」と入力してみましょう。

以上で設定完了です。検索窓から「Windows PowerShell」と検索して、「Windows PowerShell」を起動します。

「gst-launch-1.0 –version」と入力して、コマンドが実行されれば、環境の準備が整いました。

 

USBカメラセットアップ

USB2.0接続 ELP1080P@30fpsの170°レンズがついたタイプを使います。型番的なものは謎です。ドライバ不要です。USBカメラを接続すると、たいていは「device-index=0」に接続されます。※産業向けUSBカメラの場合はドライバを入れたり専用のソフトウェアが必要だったります。

ノートパソコンの場合は、ノートパソコンのカメラが「device-index=0」になっている可能性がありますので、以下のコマンドを入れてカメラ接続を確認します。

「device-index=0」では、ノートパソコン側のカメラが表示されました。

gst-launch-1.0 ksvideosrc device-index=0 ! videoconvert ! autovideosink

 

「device-index=1」で映像をチェックします。USBカメラの映像が表示されました。カメラの接続が確認できました。映像はカクカクしています。設定は後でします。

gst-launch-1.0 ksvideosrc device-index=1 ! videoconvert ! autovideosink

 

映像送信受信テスト

1台のパソコンで送受信テストをしたほうが、問題を解決しやすいです。H265でGPUでエンコードしたいところですが環境を選ぶことがあるので、今回はCPU側で処理します。検証なのでファイヤーウォールもすべてオフにします。実際に利用する場合は適宜設定ください。

 

「Windows PowerShell」を2回実行して、ウィンドウを2つ表示します。送信側と受信側として使います。

 

USBカメラの映像を1080P@30fps、x264、5Mbps、5Mbps、自分宛(127.0.0.1)で47000ポートへ送信します。※カメラが「device-index=0」の人は、0に変更してください。

送信側コマンド

gst-launch-1.0 -v ksvideosrc device-index=1 ! "image/jpeg, width=1920, height=1080, framerate=30/1" ! jpegdec ! videoconvert ! x264enc bitrate=5000 speed-preset=ultrafast tune=zerolatency ! rtph264pay ! udpsink host=127.0.0.1 port=47000

受信側コマンド

gst-launch-1.0 -v udpsrc port=47000 caps="application/x-rtp" ! rtph264depay ! avdec_h264 ! videoconvert ! autovideosink

最初は緑色に映像が破損していますが、映像が見ることができました。しばらくたつと正常に見れます。

とりあえず遅延をざっくり測定します。50msから100msでした。※きちんとした測定ではないので50msは怪しいですが100ms以下には収まっているようです。

 

映像の送信調整テスト

映像の設定をいろいろ詰めてゆきます。色空間420、caps、clock-rate、queue、RTPパケットの調整、遅延が増加しますがFEC(Forward Error Correction)なども加えてみます。(※FECが正しく機能しているかは未検証です。気持ち品質が良くなった気はします。)接続は有線LANで行います。通信状況が悪いときは、送信側のビットレートや受信側のrtpjitterbuffer latencyを調整してください。

※カメラが「device-index=0」の人は、0に変更してください。

送信側コマンド

gst-launch-1.0 -v ksvideosrc device-index=1 ! "image/jpeg, width=1920, height=1080, framerate=30/1" ! jpegdec ! videoconvert ! "video/x-raw, format=I420" ! queue ! x264enc bitrate=5000 speed-preset=ultrafast tune=zerolatency ! h264parse ! rtph264pay config-interval=-1 pt=96 ! rtpstorage ! rtpssrcdemux ! rtpulpfecenc pt=127 ! udpsink host=127.0.0.1 port=47000

受信側コマンド

gst-launch-1.0 -v udpsrc port=47000 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96" ! rtpjitterbuffer latency=5 do-retransmission=true ! rtpulpfecdec ! rtprtxreceive ! rtph264depay !  queue ! h264parse ! avdec_h264 ! videoconvert ! autovideosink

映像も先ほどより良い感じになりました。。遅延をざっくり測定します。110ms~120msでした。

 

遠隔地(VPNインターネット越し)で受信テスト

GStreamerの設定、カメラの設定、通信の設定が完了しました。次は遠隔地を想定いた受信テストを行います。VPNを用意します。VPNが準備できない人は、ローカルネットワークで別のPCでテストしてください。

受信側のパソコンにも、先ほどと同じようにGStreamerを設定してください。受信側にて用意したVPNのIPは「10.0.0.61」番です。送信側コマンドのIPを「10.0.0.61」に変更します。受信側コマンドでは、「rtpjitterbuffer latency=5」を「rtpjitterbuffer latency=20」に変更しました。

※カメラが「device-index=0」の人は、0に変更してください。
※IPはそれぞれ環境に合わせて変更してください。

 

送信側コマンド

gst-launch-1.0 -v ksvideosrc device-index=1 ! "image/jpeg, width=1920, height=1080, framerate=30/1" ! jpegdec ! videoconvert ! "video/x-raw, format=I420" ! queue ! x264enc bitrate=5000 speed-preset=ultrafast tune=zerolatency ! h264parse ! rtph264pay config-interval=-1 pt=96 ! rtpstorage ! rtpssrcdemux ! rtpulpfecenc pt=127 ! udpsink host=10.0.0.61 port=47000

受信側コマンド

gst-launch-1.0 -v udpsrc port=47000 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96" ! rtpjitterbuffer latency=20 do-retransmission=true ! rtpulpfecdec ! rtprtxreceive ! rtph264depay ! h264parse ! queue ! avdec_h264 ! videoconvert ! autovideosink

手前のノートパソコンが送信側です。奥に見えるモニターが受信側です。VPN越しに映像を送受信しています。110msぐらいでしょうか。

受信側の実際の映像はこんな感じです。

5mbps20lay

 

たまに不安定になることや、少し映像にブロックノイズが出るので、ビットレート10Mbpsを増やして、レイテンシーを50にしました。
※カメラが「device-index=0」の人は、0に変更してください。
※IPはそれぞれ環境に合わせて変更してください。

送信側コマンド

gst-launch-1.0 -v ksvideosrc device-index=1 ! "image/jpeg, width=1920, height=1080, framerate=30/1" ! jpegdec ! videoconvert ! "video/x-raw, format=I420" ! queue ! x264enc bitrate=10000 speed-preset=ultrafast tune=zerolatency ! h264parse ! rtph264pay config-interval=-1 pt=96 ! rtpstorage ! rtpssrcdemux ! rtpulpfecenc pt=127 ! udpsink host=10.0.0.61 port=47000

受信側コマンド

gst-launch-1.0 -v udpsrc port=47000 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96" ! rtpjitterbuffer latency=50 do-retransmission=true ! rtpulpfecdec ! rtprtxreceive ! rtph264depay ! h264parse ! queue ! avdec_h264 ! videoconvert ! autovideosink

手前のノートパソコンが送信側です。奥に見えるモニターが受信側です。VPN越しに映像を送受信しています。だいたい160msぐらいで表示されています。レイテンシーを50に増やした分遅延が増加した感じです。

映像はより安定してみえます。受信側の実際の映像はこんな感じです。

10mbps50lay

 

最後に無線接続をテスト

100ms~150msぐらいで、映像をネットワーク越しに送信できました。FEC(Forward Error Correction)の機能をカットすれば、もっと低遅延になるかもです。また今回は有線接続でテストしています。送信側を無線に切り替えると厳しい結果になりました。ムムム。無線環境の見直しやコマンドを見直すと上手く繋がるかもしれません。ほぼ無料で作れる1対1の超低遅延0.1秒(100ms)カメラシステムでした。

ここから広告

4G LTE、5G、5Gローカル、有線LAN、無線LANで安定する多機能な低遅延VRカメラシステム

ジュエ株式会社では、VRカメラから遠隔地のモニター表示までが50ms以下(実測41.5ms)という、極めて低遅延なVRシステムを販売しています。4G LTE、5G、5Gローカル、有線LAN、無線LANなど幅広いネットワーク環境で動作し柔軟かつ迅速な通信を実現できます。VPNや閉域網にも対応しセキュリティやプライバシーに配慮した通信も可能です。

詳しくはこちら極低遅延3D立体視VRカメラシステム「RoboScope ZeroDelay」
https://jouer.co.jp/news/roboscope-zerodelay/

 

関連記事一覧

最近の記事

オススメ記事

PAGE TOP