はじめに
Minecraftのmod開発に手を出してあれやこれやしてましたが、寄り道してJavaでのVoIPについて色々格闘してました。せっかくなので記事にしてまとめてみようと思います。今更JavaでVoIPなんて。。となる人も多いかもですが、その分逆に情報量が少なかったので参考になれば。目的はもちろんmodでの活用なので色々制限のある中での探検となりました。。
※色々調べはしたもののにわか知識のところもあるので誤りがあったらごめんなさい。。(指摘してもらえると後学のためになる&訂正します)
調べたり試したりしたライブラリ
JMF(Java Media Framework)
Javaの開発元(当時のSUN)に正式にJavaに取り込まれたメディアフレームワークで、RTPの実装もあります。今もこちらから入手可能な模様。ただ、Wikipediaなど読むとわかりますが、特にSUNのOracleによる買収後はまともにメンテもされていないらしく、ほぼオワコン感が。。
OpenJDKには含まれていないし、再頒布を前提としたOSS開発で利用するにはちょっとなぁ。。というわけで選択肢から除外。
FMJ(Freedom for Media in Java)
名前からしてJMFに対抗する気満々のOSSライブラリ。使い物になるなら選択肢かなぁ。。と思いましたがこの公式サイト?を見て一気に萎えました。サイトのデザインからしてオワコン感がありますが、おまけにサイト下部にLast Updateが2007年とか書いてあるし。こりゃ今の環境で動くかどうかすらあやしいな、ということでいったんスルーしました。(実は後に戻ってくることになりますが)
efflux
その後githubのリポジトリを色々探検することに。できるだけ☆の多いやつをたどってみましたがそこで見つけたのがこいつ。しかし。。。リポジトリの最終更新を見ると11 years ago...。スターウォーズかよ。で、依存関係を見てもnettyとか書いてあるし。。。
このライブラリはgithubからcloneしてビルドしようと試みたのですがうまくいかず、使い物にならん!とレッテルを張って封印しました。おそらくもうちょっとがんばったら使えたかもですが、今後メンテされる可能性もまずなさそうだし。。。個人の趣味で作られたライブラリっぽかったし。。
JVoIP
よくできてました。サイトはこちら。この子も落としてきて動かしてみたけど、ちゃんとネットワーク越しに会話ができるところまで確認。何よりも、ライブラリとしてとことんシンプルに作られているところが好感が持てますね。mavenリポジトリから落としてこれるようになっててもいいと思うけど、この子はjarファイル1個で完結してて、そのjarをクラスパスに通せば動きました。
核となるクラスがAppletを拡張して作られていたため、動かす時にちょっと苦労しましたがサポートに問い合わせたところ(英語)Applet非依存なライブラリも作られていて、当時未公開でしたが先行してそのバージョンを提供してもらい、無事にApplet非依存なライブラリとして動作させることもできました。
ただ。。。最大の難点は有償。。。ちょっと試しに動かしてみる分には無償でダウンロードできますが、再頒布する際にはライセンスの問題を解決する必要あり。無償公開のOSS開発をしようとしている身としては超えられない敷居だったのでGive upしました。。よくできてますけどね。ライセンス費も決して高くないので企業ユースなら検討してもよいかも?
Asterisk-Java
VoIP、SIPと言えばAsteriskでしょう。。ということでJavaの実装は無いんかな~と思って調べて見つかったのがこちら お!!と思ったけど、ただのAsteriskのWrapperでAsterisk自体、Windowsで動かそうと思ったらcygwinを入れてゴリゴリ。。なんて必要があるみたいなので今回の目的からするとNG。というわけで終了。。。
Android向けライブラリ
途中過程で色々Android向けのライブラリはヒットしました。ただ、今回はWindowsやらで動くJava版Minecraftでの利用が最終ゴールなのでそれらはすべてスルーしました。。ひょっとしたらWindows上でも使えるのかもしれないけど。まぁ、後述するようにひとまず動かせるライブラリは見つけたので、Androidアプリを開発することにならない限りそれらのライブラリに戻ってくることはないでしょう。
libjitsi
githubの☆も多かったので実はもっと前に見つけていましたが、最終的にたどり着いたのがこれ。Jitsi MeetなるOSSをベースとした無償テレカンサービスのライブラリで、VoIP以外にもWebカメの画像も飛ばせます。Jitsi Meet自体は使ったことが無いのでわからないですが、何かで課金するサービスなのかも?
とにかく、このJitsi Meet用に開発されたライブラリのlibjitsiはOSSとしてgithubでも公開されてます。libjitsi自体はそこまで更新頻度が高くないものの、それを使っているJitsi Meetはちゃんとメンテされており、libjitsiの更新頻度が低いのはほぼ枯れているからかな~と思います(とは言えこの記事執筆中の最終更新は4日前)。
ちなみにこのlibjitsi、使おうとしてわかったんですが前述のFMJを使ってます。よく見るとFMJの公式サイト?にJitsiのロゴが。。。どうやらJitsiの開発者によって陰でメンテされている模様。。
ようやくOSSでそれなりにメンテされているライブラリに巡り会えました。ただこのライブラリの最大の難点は。。。ドキュメントがほとんどねー。サンプルコードがついてますがほんのごく一部の機能しか使ってないし、動かすだけでも軽く1週間以上ハマり、ある程度やりたいことをやれるようになるまで理解するのに1カ月近く費やしました。。Javadocと不親切なサンプルコード、コミュニティのQ&Aをググりまくり、それでも解決しなければソースを読む覚悟がないと使えまへん。
また今度libjitsiの使い方についても記事にしたいと思いますが、ひとまず私がやりたいことは一通りこのライブラリでできるようになった(なってきた)のでこのライブラリで色々遊んでみようと思います。