クロスルーム PK 通話ソリューション
ライブストリーミングルームでは、ライブの雰囲気を盛り上げ、素早くファンを増やすために、配信者は他のライブストリーミングルームの配信者を招待して通話インタラクションやオンラインPKを行うことができます。通話中のライブストリーミングルームの視聴者は、複数の配信者のインタラクションを同時に聞いたり見たりできるため、インタラクションなライブストリーミングの楽しさを増し、視聴者がランキングに貢献したりギフトを送りたくなる意欲を刺激します。以下では、3つの異なるクロスルームPK通話ソリューションの具体的な実現方法を紹介します。


通常のクロスルーム PK 通話ソリューション
適用シーン
2つ以上のルームでPKを行い、ルーム内の配信者が少ない簡単なクロスルーム通話シーン。
ソリューション原理
デフォルトでは、同じルーム内のユーザー間でのみオーディオ・ビデオが相互接続され、異なるルーム間のオーディオ・ビデオストリームは相互に隔離されています。クロスルーム通話により、別のルームの特定の配信者のオーディオ・ビデオストリームを自分のいるルームに公開することができ、同時に自分のオーディオ・ビデオストリームも対象配信者のルームに公開されます。これにより、2つの異なるルームにいる配信者がルームを跨いでオーディオ・ビデオストリームを共有し、各ルームの視聴者が両方の配信者のオーディオ・ビデオを視聴できるようになります。


実現フロー
ルーム「101」のユーザーは、配信者Bの
onRemoteUserEnterRoom(B)とonUserVideoAvailable(B,true)という2つのイベントコールバックを受信します。即ち、ルーム「101」のユーザーは全員、配信者Bのオーディオ・ビデオをサブスクライブできます。ルーム「102」のユーザーは、配信者Aの
onRemoteUserEnterRoom(A)とonUserVideoAvailable(A,true)という2つのイベントコールバックを受信します。即ち、ルーム「102」のユーザーは全員、配信者Aのオーディオ・ビデオをサブスクライブできます。注意:
2つのルームで単一配信者のクロスルームPKを行う場合、一方のルームの配信者が
ConnectOtherRoomを呼び出してクロスルーム通話を確立するだけで十分です。双方向での呼び出しは行わないでください。配信者は
ConnectOtherRoomを複数回呼び出すことで、複数のルームの配信者とクロスルーム通話を確立できます。現在、単一配信者は他のルームの最大9人の配信者とクロスルーム通話を行うことができます。リアルタイムインタラクションクロスルーム通話
RTCシーンにおけるクロスルーム通話PKフローは全体的に簡単で、配信者とクロスルーム通話配信者が互いにRTCシングルストリームを受信し、視聴者は同時に配信者とクロスルーム通話配信者のRTCシングルストリームを受信します。視聴者は配信者とクロスルーム通話配信者のメディアストリームサブスクリプションロジックを独立して制御できます。リアルタイムインタラクションシーンのクロスルーム通話フローは下図の通りです。


注意:
リアルタイムインタラクションクロスルーム通話シーンでは、ルーム内の視聴者はクロスルーム通話配信者のメディアストリームサブスクリプションロジックを独立して制御でき、また配信者がクロスルーム配信者の当該ルームにおけるアップリンク能力を変更することも可能です。
サンプルコード
1. いずれか一方がクロスルーム PK 通話を開始します。
public void connectOtherRoom(String roomId, String userId) {try {JSONObject jsonObj = new JSONObject();// 文字列ルーム番号を例に、数字ルーム番号 key:roomIdjsonObj.put("strRoomId", roomId);jsonObj.put("userId", userId);mTRTCCloud.ConnectOtherRoom(jsonObj.toString());} catch (JSONException e) {e.printStackTrace();}}// クロスルーム通話リクエストの結果コールバック@Overridepublic void onConnectOtherRoom(String userId, int errCode, String errMsg) {// userId: クロスルーム通話するもう一方のルームの配信者のユーザーID// errCode: エラーコード、ERR_NULLはリクエスト成功を表します// errMsg: エラーメッセージ}
- (void)connectOtherRoom:(NSString *)roomId {NSMutableDictionary *jsonDict = [[NSMutableDictionary alloc] init];// 文字列ルーム番号を例に、数字ルーム番号 key:roomId[jsonDict setObject:roomId forKey:@"strRoomId"];[jsonDict setObject:self.userId forKey:@"userId"];NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDict options:NSJSONWritingPrettyPrinted error:nil];NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];[self.trtcCloud connectOtherRoom:jsonString];}// クロスルーム通話リクエストの結果コールバック- (void)onConnectOtherRoom:(NSString *)userId errCode:(TXLiteAVError)errCode errMsg:(NSString *)errMsg {// userId: クロスルーム通話するもう一方のルームの配信者のユーザーID// errCode: エラーコード、ERR_NULLはリクエスト成功を表します// errMsg: エラーメッセージ}
注意:
クロスルームPK通話のローカルユーザーと相手側ユーザーは、両方とも配信者ロールであり、かつオーディオまたはビデオのアップリンクが必要です。
2つのルームで単一配信者のクロスルームPKを行う場合、一方のルームの配信者が
ConnectOtherRoomを呼び出してクロスルーム通話を確立するだけで十分です。双方向での呼び出しは行わないでください。2. 2つのルーム内のすべてのユーザーは、もう一方のルームのPK配信者からのオーディオ・ビデオストリーム利用可能コールバックを受信します。
@Overridepublic void onUserAudioAvailable(String userId, boolean available) {// あるリモートユーザーが自身のオーディオを公開/キャンセルしました// 自動サブスクリプションモードでは、何も操作する必要はなく、SDKが自動的にリモートユーザーのオーディオを再生します}@Overridepublic void onUserVideoAvailable(String userId, boolean available) {// あるリモートユーザーがメインストリームのビデオ画面を公開/キャンセルしましたif (available) {// リモートユーザーのビデオストリームをサブスクライブし、ビデオレンダリングコントロールをバインドしますmTRTCCloud.startRemoteView(userId, TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG, view);} else {// リモートユーザーのビデオストリームのサブスクリプションを停止し、レンダリングコントロールを解放しますmTRTCCloud.stopRemoteView(userId, TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG);}}
- (void)onUserAudioAvailable:(NSString *)userId available:(BOOL)available {// あるリモートユーザーが自身のオーディオを公開/キャンセルしました// 自動サブスクリプションモードでは、何も操作する必要はなく、SDKが自動的にリモートユーザーのオーディオを再生します}- (void)onUserVideoAvailable:(NSString *)userId available:(BOOL)available {// あるリモートユーザーがメインストリームのビデオ画面を公開/キャンセルしましたif (available) {// リモートユーザーのビデオストリームをサブスクライブし、ビデオレンダリングコントロールをバインドします[self.trtcCloud startRemoteView:userId streamType:TRTCVideoStreamTypeBig view:self.remoteView];} else {// リモートユーザーのビデオストリームのサブスクリプションを停止し、レンダリングコントロールを解放します[self.trtcCloud stopRemoteView:userId streamType:TRTCVideoStreamTypeBig];}}
3. いずれか一方がクロスルームPK通話を終了します。
// クロスルーム通話を終了mTRTCCloud.DisconnectOtherRoom();// クロスルーム通話終了結果のコールバック@Overridepublic void onDisConnectOtherRoom(int errCode, String errMsg) {super.onDisConnectOtherRoom(errCode, errMsg);}
// クロスルーム通話を終了[self.trtcCloud disconnectOtherRoom];// クロスルーム通話終了結果のコールバック- (void)onDisconnectOtherRoom:(TXLiteAVError)errCode errMsg:(NSString *)errMsg {}
注意:
サーバー側クロスルームPK通話ソリューション
適用シーン
複数のルームでのPK、各ルームに複数の配信者がいる純粋なサーバー側クロスルーム通話シーン。
ソリューション原理
サーバー側で複数のミックスストリーミング転送タスクを起動し、各転送タスクはAgentボットユーザーを起動して自身のReal-Time Communication Engine (RTC Engine)ルームに入室させてストリームを受信し、同時に1つ以上のFeedボットユーザーを起動して混合されたオーディオ・ビデオストリームをクロスルームPK通話に参加している他のRTC Engineルームにフィードバックします。これにより、異なるルームのユーザーは他のルームのミックスストリーミングフィードバックをサブスクライブすることで、クロスルームPK通話を実現できます。


実現フロー
リアルタイムインタラクションクロスルーム通話
1. ルームAの配信者がルームBの配信者とルームNの配信者にクロスルームPKリクエスト(業務シグナリング)を送信します。
2. ルームBの配信者とルームNの配信者がクロスルームPKリクエスト(業務シグナリング)に同意します。
3. 業務バックエンドは同時にN個のミックスストリーミングフィードバックルームタスクStartPublishCdnStreamを開始します。
タスク1:A_AgentボットがAルームの配信者メディアストリームを受信し、RTC Engineバックエンドでミキシングされた後、A_FeedボットによってBルームとNルームにフィードバックされます。
タスク2:B_AgentボットがBルームの配信者メディアストリームを受信し、RTC Engineバックエンドでミキシングされた後、B_FeedボットによってAルームとNルームにフィードバックされます。
タスク N:N_Agent ボットが N ルームの配信者メディアストリームを受信し、RTC Engine バックエンドでミキシングされた後、N_Feed ボットによって A ルームと B ルームにフィードバックされます。
4. ルームA、ルームB、ルームNのユーザーがルーム内のミックスストリームフィードバックされたオーディオ・ビデオストリームを互いに受信し、クロスルームPKを開始します。
5. クロスルームPKが終了し、業務バックエンドはTaskIdを通じてN個のミックスストリームフィードバックルームタスクStopPublishCdnStreamを停止します。
注意:
本ソリューションは最大11ルームでの同時クロスルームPK通話をサポートし、各ルームは最大16人の配信者が同時に通話に参加できます。
ボットIDはルーム内の通常ユーザーIDと競合してはいけません。そうでないと、ボットユーザーがRTC Engineルームから退出させられるため、転送タスクが異常終了する可能性があります。
サンプルコード
以下は、純粋なオーディオシーンを例に、クロスルームPKミックスストリーミングフィードバックルームタスクのパラメータ例を示します。
{"SdkAppId": 1400000000,"RoomId": "A","RoomIdType": 1,"AgentParams": {"UserId": "A_Agent","UserSig": "eJwtjMEKgkAUAP9lz2Hv6b40oU...","MaxIdleTime": 50},"WithTranscoding": 1,"AudioParams": {"AudioEncode": {"Codec": 0,"SampleRate": 48000,"Channel": 2,"BitRate": 64}},"FeedBackRoomParams": [{"RoomId": "B","RoomIdType": 1,"UserId": "A_Feed","UserSig": "eJwtzEELgkAUBOD-sldD3745..."},{"RoomId": "N","RoomIdType": 1,"UserId": "A_Feed","UserSig": "eJwtzEELgkAUBOD-sldD3745..."}]}
{"SdkAppId": 1400000000,"RoomId": "B","RoomIdType": 1,"AgentParams": {"UserId": "B_Agent","UserSig": "eJwtjMEKgkAUAP9lz2Hv6b40oU...","MaxIdleTime": 50},"WithTranscoding": 1,"AudioParams": {"AudioEncode": {"Codec": 0,"SampleRate": 48000,"Channel": 2,"BitRate": 64}},"FeedBackRoomParams": [{"RoomId": "A","RoomIdType": 1,"UserId": "B_Feed","UserSig": "eJwtzEELgkAUBOD-sldD3745..."},{"RoomId": "N","RoomIdType": 1,"UserId": "B_Feed","UserSig": "eJwtzEELgkAUBOD-sldD3745..."}]}
{"SdkAppId": 1400000000,"RoomId": "N","RoomIdType": 1,"AgentParams": {"UserId": "N_Agent","UserSig": "eJwtjMEKgkAUAP9lz2Hv6b40oU...","MaxIdleTime": 50},"WithTranscoding": 1,"AudioParams": {"AudioEncode": {"Codec": 0,"SampleRate": 48000,"Channel": 2,"BitRate": 64}},"FeedBackRoomParams": [{"RoomId": "A","RoomIdType": 1,"UserId": "N_Feed","UserSig": "eJwtzEELgkAUBOD-sldD3745..."},{"RoomId": "B","RoomIdType": 1,"UserId": "N_Feed","UserSig": "eJwtzEELgkAUBOD-sldD3745..."}]}
注意:
純粋なオーディオシーンでは、RTC Engineバックエンドはルーム内のすべての配信者のオーディオストリームをデフォルトでミックスします。また、オーディオパラメータMcuAudioParamsを使用して、オーディオミックスストリーミングのブラックリスト/ホワイトリストを指定することもできます。
クロスルーム PK 通話ソリューションの比較分析
上記では、3つの異なるクロスルームPK通話の実現ソリューションを紹介しました。それぞれに異なる適用シーンがあります。以下では、4つの次元で異なるクロスルーム通話ソリューションを比較分析します。
ソリューションタイプ | ソリューション利点 | ソリューション欠点 | ルーム及び人数制限 | おすすめの使用シーン |
2人PKの呼び出しロジックは簡単です | 複数人PKの呼び出しロジックは複雑です | 単一配信者は他のルームの最大9人の配信者とクロスルームPK可能 | 2つのルーム、単一配信者(2人)のクロスルームPK | |
純粋なサーバー側ソリューションであり、クライアント側で追加処理不要 | 追加のボットの配信・受信およびミックスストリーミング費用が発生します | 最大11ルームでの同時クロスルームPKをサポートし、各ルームは最大16人の配信者が同時にクロスルームPKに参加できます | 複数のルーム、複数の配信者(複数人)によるクロスルームPK、純粋なサーバー側管理 |