コムセント 技術情報

  1. TOP
  2. コムセント 技術情報
  3. Zoomの機能を独自アプリとして利用する

Zoomの機能を独自アプリとして利用する

テレワークなどやオンライン会議などで有用なツールとして、良く使われるようになったのがZoomでは無いでしょうか?
ZoomはPC向け、スマートフォン向けなどに公式のソフトウェアが提供されていますが、Zoomの主機能を組み込んだ独自アプリを作成することも可能です。
例えば、オンライン授業などでは横に教科書の画像などを表示するようにしたり、教師が生徒側のスピーカーやマイクをON/OFFすることも可能です。
Zoomは比較的安価に安定した映像配信を行うことができます。カスタマイズして独自機能を組み込めば、映像を見ながらというこれまでであれば高額になりがちな仕組みも月額が安価に実現できます。

ZoomではZoomの機能を利用するためのSDK(SoftwareDevelopmentKit)を提供しており、これを自分で作成したプログラムに組み込んで利用することで、Zoomの機能を比較的簡単に利用することができます。
ただし、ZoomのSDKは結構独特な仕組みになっているところもあり、情報が少ないことも相まって、開発難易度は比較的高いところがあります。
ミーティングに参加する、などの部分はサンプルも豊富にあるため、さほど実装は難しく無いですが、機能を使いつつ、独自機能を組み込むとなると、ちょっとプログラムを勉強して、、というレベルでは実現不可能です。
また、Zoomの公式アプリでは実現可能なところが実現できない、というものもあります。この辺はリファレンスからは確認しづらいので注意が必要です。

iOS向けの開発

現在提供されているZoomのSDKでは、ObjectCでの実装サンプルが付いてきます。もちろんSwiftでの開発も可能ですが、サンプルが無いため、ObjectCを読んで解釈するか、リファレンスを把握した上で実装する必要があります。もっとも、Zoomでは呼び出し順番を守る必要のあるメソッドがある(しかしリファレンスには記載なし)ほか、内部では非同期的に動作しているものがあるため、Sleepなどを利用して処理する必要があるところがいくつか存在します。この辺りは実装してみないと分からない点でもあります。

ZoomのSDKでは、UIが組み込まれた状態になっています。そのため、自分でUIを作成して機能だけを使いたい場合は、SDKを初期化する段階で自分独自のUIを利用する、と指定する必要があります(CustomUIと呼んでいます)

できないこと、やりづらいところ

Zoomではブレークアウトルームが利用可能ですが、ZoomSDKでブレークアウトルームを使う場合、メソッドの呼び出し順番に注意が必要です。ホスト権を所有した上で、ブレークアウトルームを作成します。作成したブレークアウトルームにユーザーを割り振ります(この際に指定したユーザーということができません)。これで各ユーザーに対してブレークアウトルームへの割当が行われます。その上で、ブレークアウトルームをstartします。誰も割当をしていないとStartすることができません。Startしてからユーザーを割り当てる場合は違うメソッドを利用する点もちょっと分かりづらいところかも知れません。
この際にさまざまなメソッドを使いますが、ある程度間隔を開けながら呼び出す必要がある、場合によっては複数回呼ぶ必要があるなど、トライアンドエラーが必要なところです。
ホストがブレークアウトルームを立ち上げて、ユーザーをブレークアウトルームに入れることはできますが、任意のユーザーを任意のブレークアウトルームに入れる簡単な方法が提供されていないため、かなりイレギュラーな方法で実装する必要があります。

画面共有はiOSの場合、ReplayKitを利用したものがZoomによって提供されているほか、比較的詳しい設定方法がZoomサイトに紹介されているため、そのままの通り実装すれば利用可能です。ここは順番通りに従って実装していけば、変なことが起きない限りは比較的容易に実装ができます。但し、画面共有をしたときに、注釈を入れるなどの機能は無いため、必要であれば実装が必要です。Zoomのアプリではホワイトボード機能などが搭載されていますが、これはZoomSDKのCustomUIでは利用できません。利用したい場合は、変わりになるようなものを別途実装する必要があります。

Android向けの開発

Android向けのSDKではJavaでの実装サンプルが付いてきます。また、リファレンスも付いてきますが、その通りに読んでも実装はかなり難しいです。厄介なのが、独自のUIを作成する際に、レイアウト用のXMLを定義する必要がありますが、これの指定方法が明確に書いていないため、ここを探して対応する必要があります。(実際には何となく画面レイアウトの例が提示されていますが、その通りにはできないです)例えば、任意のユーザーのカメラ映像を表示する場合、XMLとしては以下のような記述を行います。

<us.zoom.sdk.MobileRTCVideoView
android:id="@+id/cameraview"
android:layout_width="0dp"
android:layout_height="0dp">
</us.zoom.sdk.MobileRTCVideoView>


リファレンスには明確に記述されていないのですが、上記のコードだけで表示領域を作成することは可能です。また、画面共有の場合も同じ記述で問題ありません。ちなみに画面共有はVideoViewで表示を扱う点は注意が必要かも知れません。

Androidの場合、GooglePlayで公開する場合、adb形式にする必要がありますが、このときにZoomSDKが取り除かれることがあるため、proguard-rules.proに以下を追記しておく方が無難です。
-keep class us.zoom.{;} -keep class com.zipow.{;}
-keep class us.zipow.{;} -keep class org.webrtc.{;}
-keep class us.google.protobuf.{;} -keep class com.google.crypto.tink.{;}
-keep class androidx.security.crypto.*{;}

Tips

ZoomSDKではユーザーの識別をすべてミーティングに参加したときにユーザーに割り当てる、UserIDで識別しています。これが結構くせ者で、UserIDは使い回されることがあるため、同一ミーティングにおいて、先に参加したAさんに割り当てられたUserIDがAさんが退室した後で、後から参加したBさんに同一のUserIDが割り当てられることがあります。
またブレークアウトルームへ移動すると別のUserIDが割り当てられますし、ブレークアウトルームから戻ってきたらまた別のUserIDが割り当てられるため、ユーザーの識別をUserIDベースで行うと比較的混乱することが多いです。別のシステムと組み合わせて利用する場合は、別のシステムで生成したIDを用いてユーザーの管理を行う方が良いでしょう。

弊社ではZoomのSDKを使った案件にも対応しております。データベースや他のシステムと組み合わせて利用することも対応可能です。
Zoomや映像配信などを使ったシステム構築をご検討されている場合は、是非ご相談ください。

おすすめ記事