コンテンツ共有
コンテンツ共有APIは、時間の流れによって変化するデータをピアと共有できるようにします。共有するデータのタイプは何でも構いませんが、最大1キロバイトでなければなりません。
対応する通話タイプ | SDKの最低バージョン |
---|---|
1対1通話、グループ通話(カンファレンス) | PlanetKit 3.3(ルーム範囲を共有:PlanetKit 3.6.19) |
1対1通話とグループ通話共にコールセットアップ(call setup)が完了した後、コンテンツ共有APIを使用できます。
コンテンツ共有タイプ
LINE Planetが提供するコンテンツの共有方法は、以下のとおりです。
コンテンツ共有タイプ | 説明 | 備考 |
---|---|---|
一般共有 | 各ユーザーが自分のデータを共有します。 | |
排他的(exclusive)共有 | ルームにいるすべてのユーザーに同じ共有データが必要な場合に使用します。詳しくは、排他的共有を参照してください。 | |
ルーム範囲(room-scoped)共有 | 共有データのライフタイムがルーム範囲に指定されます。詳しくは、ルーム範囲共有を参照してください。 | グループ通話でのみ利用可能 |
3つのタイプのコンテンツ共有は独立しているため、1つのルーム内で同時に使用できます。
関連API
通話タイプごとに、コンテンツ共有に関するAPIについて説明します。
1対1通話
1対1通話でコンテンツを共有するには、ContentShareCall
の以下のメソッドを使用します。
タイプ | メソッド | 説明 | 関連イベントコールバック |
---|---|---|---|
一般共有 | SetSharedContents() | すべてのピアと共有する共有データの設定 | OnPeersSetSharedContents |
- | UnsetSharedContents() | 以前設定した共有データの解除 | OnPeersUnsetSharedContents |
排他的共有 | SetExclusivelySharedContents() | すべてのピアと共有する排他的共有データを設定 | OnPeerSetExclusivelySharedContents |
- | UnsetExclusivelySharedContents() | 以前設定した排他的共有データの解除 | OnPeerUnsetExclusivelySharedContents |
グループ通話
グループ通話でコンテンツを共有するには、ContentShareConference
の以下のメソッドを使用します。
タイプ | メソッド | 説明 | 関連イベントコールバック |
---|---|---|---|
一般共有 | SetSharedContents() | すべてのピアと共有する共有データの設定 | OnPeersSetSharedContents |
- | UnsetSharedContents() | 以前設定した共有データの解除 | OnPeersUnsetSharedContents |
排他的共有 | SetExclusivelySharedContents() | すべてのピアと共有する排他的共有データを設定 | OnPeerSetExclusivelySharedContents |
- | UnsetExclusivelySharedContents() | 以前設定した排他的共有データの解除 | OnPeerUnsetExclusivelySharedContents |
ルーム範囲共有 | SetRoomSharedContents() | ルームのすべてのピアと共有するルーム範囲共有データの設定 | OnPeerSetRoomSharedContents |
- | UnsetRoomSharedContents() | 以前設定したルーム範囲共有データの解除 | OnPeerUnsetRoomSharedContents |
ピアに渡される情報
あるユーザーが共有コンテンツ設定メソッドのいずれかを使用してデータ共有を開始すると、それぞれ該当するイベントコールバックが他のユーザー対して呼び出されます。このコールバックは次のようなgetterメソッドを提供するCommonSetSharedContent
クラスのオブジェクトを渡します。
メソッド | 説明 |
---|---|
GetPeerID() | 共有データを設定したピアのID情報を取得します。 |
GetPeer() | 共有データを設定したピアの情報を取得します。 |
Data() | 共有データを取得します。 |
DataSize() | 共有データのサイズを取得します。 |
ElapsedAfterSetMsec() | 共有データの最終修正から経過した時間を取得します(ミリ秒単位)。 |
経過時間情報を利用することで、共有データの最終修正から経過した時間を計算できます。
排他的共有
「排他的共有」とは、共有データがルーム(または通話)内に、たった1つしか存在しないことを意味します。
ルームにいるすべてのユーザーに同じ共有データが必要な場合は、SetExclusivelySharedContents()
およびUnsetExclusivelySharedContents()
を使用します。
排他的共有コンテンツの場合、SetExclusivelySharedContents()
を呼び出した参加者だけが共有データを修正できます。
ルーム範囲の共有
PlanetKitは、ルーム範囲のコンテンツを共有するためにSetRoomSharedContents()
およびUnsetRoomSharedContents()
を提供します。この機能はグループ通話でのみ利用できます。その特長は以下のとおりです。
- データライフタイム
- ルーム範囲内のコンテンツ共有では、
UnsetRoomSharedContents()
を呼び出さない限り、データのライフタイムとルームのライフタイムは同じです。 - 一方、
SetSharedContents()
とSetExclusivelySharedContents()
で共有したデータのライフタイムは、そのAPIを呼び出した参加者によって左右されます。つまり、その参加者が退出するとデータも無効になります。 - それに対して、
SetRoomSharedContents()
で共有したデータは、すべての参加者が退出するか、誰かがUnsetRoomSharedContents()
を呼び出さない限り保持されます。
- ルーム範囲内のコンテンツ共有では、
- 複数の設定者と1つのインスタンス
- ルーム範囲内のコンテンツ共有で、
SetRoomSharedContents()
で共有したデータは、すべての参加者が変更できます。したがって、共有データの値は、最後に呼び出したSetRoomSharedContents()
で設定したデータになります。 - ルーム範囲内のコンテンツ共有は、設定する人が複数いることを想定しているので、最後の設定者が退出しても、残りの参加者は関連イベントを受信します。
- ルーム範囲内のコンテンツ共有で、
例 - 発言する前に手を挙げる
コンテンツ共有APIの使い方について簡単な例を見てみましょう。この例は、排他的共有とは何であるか、共有データ構造をどのように設計するのかを示しています。
通話の参加者が発言する前に「手を挙げる」機能をコンテンツ共有APIで実装するとします。また、「手を挙げる」フラグは、わずか3秒(3,000ミリ秒)の間だけ有効であると仮定します。
まず、参加者が同時に手を挙げることができると仮定します。つまり、複数の参加者が手を挙げることができます。
- 共有データ構造:flag
- 発言したい人は誰でも
flag=true
でSetSharedContents()
を呼び出します。 OnPeersSetSharedContents
に含まれるユーザーID情報により、誰が発言しようとしているのかすべての参加者が知ることができます。- 「経過時間3,000ミリ秒未満」の条件を満たす参加者だけが手を挙げることができます。誰かが手を挙げてから4,000ミリ秒後に参加した新規の参加者は、
OnPeersSetSharedContents
を受け取ることで誰が手を挙げたのかは分かりますが、その時点では手を挙げることはできません。
次に、一度に1人の発言者しか手を挙げられないと仮定します。つまり、たった1人の参加者だけが手を挙げることができます。この場合はマスターが必要です。マスターのユーザーIDをuser-m
と仮定します。
- 共有データ構造:flag
- マスターが
h-user-id=NULL, flag=false
と共にSetExclusivelySharedContents()
を呼び出します。それ以降、他の参加者がSetExclusivelySharedContents()
を呼び出しても無視されます。 - 発言しようとする人は誰もが
user-m
にsendShortData()を呼び出します。 - マスターがそのうちの1人だけを選びます。そのユーザーを
user-a
と仮定します。 - マスターが
h-user-id=user-a, flag=true
と共にSetExclusivelySharedContents()
を呼び出します。 - すべての参加者は、
OnPeerSetExclusivelySharedContents
からuser-a
(h-user-id
)が発言しようとしている(flag=true
)ことが分かります。