我が名はなんとか菜である!

主に技術系の記事を書きますが、ポエムも混入します。

【C++,RTP】JRTPLIBについて覚え書き

最近、C++でRTP(RTCP)を使ったリアルタイム通信を書く機会があったので、その時に使ったライブラリとかについて書いておこうと思います。

"JRTPLIB"というライブラリなのですが、どうやら相当マイナーらしく、まともな資料が製作者が書いたと思われるこのリファレンスのみ(当然英語)というそこそこな敷居なものだったので、ここにビルド~動作するところまで書いておけば将来の自分と誰かの役に立つんじゃねーかな?とか思ってます。

まあC++でRTP通信とか普通やりませんわなC#とかJava使っとけよって感じっていうかC++でRTPなんて書いてんのか将来の僕は

なお、読者のレベルはC++を日頃書いている人を想定しています。

闇の魔術に精通している必要はないですが、基本的なことは知っているぐらいの人向けです。C++に関する文法などは各自調べてください。

 ビルドとインストール

まずはここからソースコードをダウンロード。

bz2形式とかgz形式、zip形式がありますが、環境や宗派に合わせて落とせばいいと思います。

このときちょっと下の方に目を向けると、JThreadとか言うのも入れとくと裏でいろいろやってくれるようになっていいよ的なことが書いてありますが、なくても一応動きます。という訳で今回は入れずに行きましょう。

適当に解凍したらCMakeを起動し、(ない人は入れてネ)

Where is the source codeにライブラリのディレクトリ、

Where to build the binariesには、上のディレクトリの下に適当に"test"みたいなディレクトリを作ってそこを指定します。

 

f:id:happo31:20151023212156p:plain

 

ここまでできたら左下のConfigureをクリックします。すると、どのビルドシステム向けにmakeファイル(及びIDEのプロジェクトファイル)を生成するか聞かれるので、お好きなものを選びます。

WindowsならVisual Studioのどれか、MacLinuxならUnix bashなんたら(わすれた)みたいなやつにしておくのがいいと思います。まあ、後でビルドさえ出来ればなんでもいいです。

Finishというボタンを押すと、真ん中のテキストエリアに何やらずらずらと赤い色に塗りつぶされた項目が出てきます。赤いのでエラーだと一瞬思うかもしれませんが大丈夫です。CMAKE_INSTALL_PREFIXは、ライブラリをインストールするディレクトリの指定になるので、好きな場所を指定しておきましょう。

f:id:happo31:20151024044023p:plain

 

適当にもう一度Configureを押すと赤いのが消えます。

ここまで良ければGenerateを押しましょう。2番目のテキストボックスに設定したディレクトリに、Generateで設定したビルドシステム向けのファイルが生成されます。

(make && make installなりsln開いてソリューションのビルドなり・・・あ、VSの場合はソリューションのビルドが終わった後にINSTALLというプロジェクトをビルドするとインストールが完了します 便利)

ここまでのどこかでエラーが出る場合は恐らくCMakeのバージョンが古いです。CMakeの最新版をインストールしてみてください。

 

動かしてみよう

ビルド時に吐き出されたライブラリファイルのリンクやらヘッダやらの説明は省略します。各自きちんとやっておきましょう。

JRTPLIB自体は、英語しか資料がないとはいえ、かろうじて読めるレベルの僕でさえ扱えるぐらいには使い方は簡単です。

ドキュメントに書かれているクラス自体は膨大ですが、使うのはRTPSessionと、あと通信のセットアップに関する情報を司るクラスだけです。

ほんとはどこがどうやってるのかじっくり書いていくべきですが、なんかめんどくさくなったので、Gistを貼っておきます。ソースコードにはコメントを散りばめておいたので許して。

Visual Studio 2015 Enterpriseで動作を確認しています。

 

JRTPLIB Run Test

 

UNIX系で動かしたい場合でも差はたぶんIPアドレスのバイトオーダーへの変換に使ってる関数とかその辺だけだと思います、たぶん。一応ifdefしてみましたが、動かなかった時は頑張ってください(丸投げ)

使い方は、こいつを2個立ち上げていい感じにIPアドレスとポートをコマンドラインで指定してあげるだけ。うまく行けばこんな感じに出力されます。

f:id:happo31:20151024051450p:plain

下のが0から始まってないのはちょっと遅れてから立ち上げたからです。手動最高。

 

というわけでかなり大雑把な感じの記事になってしまいましたが、備忘録としては十分機能してくれることを祈ります。

ちなみに、ちゃんと音声などのメディアをやりとりしたいとなった場合は、109行目のSendPacketの引数の後半部分をメディアに合わせてちゃんと設定してあげる必要があります。

そのへんの話はまた別の機会に回したいと思います。(RTCPとか)