C++言語

ブラウザでRTSPストリーミング再生【C++版】

2024年2月14日

はじめに

カメラなどで使用されている RTSP ストリーミングは、そのままではブラウザで再生するできません。
そこで、できるだけシンプル・簡単に RTSP のストリーミング再生をブラウザで行えるようにする
WebSocket と HTML Canvas を使って実現する方法を以下の記事でご紹介しました。

こちらもCHECK

ブラウザでRTSPストリーミング再生

カメラなどで使用されているRTSPストリーミングは、そのままではブラウザで再生することはできません。そこで、シンプル・簡単に RTSP のストリーミング再生をブラウザで行えるようにするWebSocketとHTML Canvasを使って実現する方法をご紹介いたします。

続きを見る

 

前回は WebSocket サーバ、つまり画像を送信する側のコードを Python で記述しましたが、
今回は C++ 版で実装する場合のコードを掲載いたします。

SANACHAN
SANACHAN
Python 版の実力、90 FPSでは足りないようです(笑)

 

全体の構成

本記事では、以下のフォルダ構成を元に解説しています。

 Source Tree
/
|- inc/
|   |- Base64.h
|   |- Config.h
|   |- JsonWrapper.h
|   |- picojson.h
|- src/
|   |- Main.cpp
|- build.sh
|- video.mp4

 

ユーティリティの準備

C++ 言語の標準ライブラリでは、Base64 変換や JSON を扱うことができません。
そのため、それらを行うためのユーティリティを準備してあげる必要があります。

 

Base64 変換

SANACHAN
SANACHAN
バイナリ↔Base64文字列を相互に変換する関数です。

 

JSON フォーマット

おおもとのライブラリには、BSD ライセンスで最も軽量な picojson を利用しています。
ただ、そのままだと C++ では扱いにくいため、ラッパー関数を用意しました。

SANACHAN
SANACHAN
Takapさんの記事を流用しています。

 

その他

定数の宣言、及びビルドスクリプトです。

 

WebSocket サーバの実装

WebSocket のライブラリは、libwebsocketpp を使用しました。
ヘッダーだけで記述されたライブラリのため、コンパイルに少し時間がかかりますが軽量です。

以下のコマンドでインストールします。

 command
$ sudo apt install libwebsocketpp-dev

 

お待ちかねのコードです。
Python 版の websocket_server.py と等価となります。

注意事項

Python 版と同じように、WebSocket を使った本手法で FPS が最大になるよう実装しています。
本来は、on_message 内で受信したデータの処理をしたら、return する必要があります。
libwebsocketpp の接続管理などは、こちらの OutputWebSocket クラスを参照ください。

 

おわりに

いかがでしたでしょうか。
こちらですと、Ubuntu 20.04 LTS の VM 環境で 120 FPS を出すことができました。

VM 環境ではなく Native 環境にし、Base64 変換を最適化すれば、
もう少し早くなると思います。

 

こちらの記事もよく読まれています

  • この記事を書いた人
  • 最新記事
SANACHAN

SANACHAN

「生涯一エンジニア」を掲げ、大手グローバル企業でSE/PGとして8年勤め、キャリアアップ転職した現役のエンジニアです。世にあるメジャーな全プログラム言語(コボル除く)を自由に扱えます。一児の父。自分のため、家族のため、日々勉強してます。システムエンジニア、プログラミングに関する情報を蓄積している雑記帳です。

-C++言語
-, ,