• 서비스
  • 가격
  • 리소스
  • 기술지원

스트리머 간 크로스 룸 PK 연결 방안

라이브 방송실에서 방송 분위기를 좋게 만들고 빠르게 팬을 모으기 위해 스트리머는 다른 라이브 방송실의 스트리머를 초대해서 인터랙티브나 온라인 PK를 할 수 있습니다. 연결된 라이브 방송실의 시청자는 여러 스트리머의 인터랙션을 동시에 청취및 시청할 수 있습니다. 이는 인터랙티브 라이브의 재미를 더하고 시청자들이 선물을 보내고 순위를 올리고 싶은 욕구를 자극합니다. 아래에서는 세 가지 서로 다른 스트리머 간 크로스 룸 PK 연결 방안의 구체적인 구현을 소개하겠습니다.




일반적인 스트리머 간 크로스 룸 PK 연결 방안

적용 시나리오

두 개나 두 개 이상의 방 PK, 또는 방 스트리머 수가 적은 간단한 크로스 룸 연결 시나리오.

솔루션 원리

기본적으로 동일한 방의 사용자들 간에만 음성 및 영상이 상호 통신할 수 있으며 다른 방 간의 음성 및 영상 스트림은 서로 격리되어 있습니다. 크로스 룸 연결을 통해 다른 방의 특정 스트리머의 음성 및 영상 스트림을 자신이 있는 방에 게시할 수 있으며, 동시에 자신의 음성 및 영상 스트림을 대상 스트리머의 방에 게시할 수 있습니다. 이렇게 하여 서로 다른 두 방에 있는 스트리머들이 방을 넘어 음성 및 영상 스트림을 공유할 수 있게 되어 각 방의 시청자들이 두 스트리머의 음성 및 영상을 같이 볼 수 있습니다.




구현 프로세스

방"101"의 스트리머 A가 ConnectOtherRoom을 통해 방 "102"의 스트리머 B와 크로스 룸 통화를 설정한 후
방 "101"의 사용자들은 모두 스트리머 B의 onRemoteUserEnterRoom(B)onUserVideoAvailable(B,true) 이 두 가지 이벤트 콜백을 받게 되며, 이는 방 "101"의 사용자들이 모두 스트리머 B의 음성 및 영상을 구독할 수 있음을 의미합니다.
방 "102"의 사용자들은 모두 스트리머 A의 onRemoteUserEnterRoom(A)onUserVideoAvailable(A,true) 이 두 가지 이벤트 콜백을 받게 되며, 이는 방 "102"의 사용자들이 모두 스트리머 A의 음성 및 영상을 구독할 수 있음을 의미합니다.
주의:
두 방의 단일 스트리머 크로스 룸 PK는 한 방의 스트리머만 ConnectOtherRoom을 호출하여 크로스 룸 연결을 설정하면 되며 양쪽은 다 호출하지 마십시오.
스트리머는 ConnectOtherRoom을 여러 번 호출하여 여러 방의 스트리머와 크로스 룸 연결을 설정할 수 있으며, 현재 단일 스트리머는 최대 다른 방의 9명 스트리머와 크로스 룸 연결이 가능합니다.

실시간 인터랙티브 크로스 룸 연결

RTC 시나리오의 크로스 룸 연결 PK 프로세스는 전반적으로 간단합니다. 스트리머와 크로스 룸 연결 스트리머는 서로 RTC 단일 스트림을 풀하고 시청자는 동시에 스트리머와 크로스 룸 연결 스트리머의 RTC 단일 스트림을 풀며, 시청자는 스트리머와 크로스 룸 연결 스트리머의 미디어 스트림 구독 로직을 독립적으로 제어할 수 있습니다. 실시간 인터랙티브 시나리오의 크로스 룸 연결 프로세스는 아래 그림과 같습니다.



주의:
실시간 인터랙티브 크로스 룸 연결 시나리오에서 방 내 시청자는 크로스 룸 연결 스트리머의 미디어 스트림 구독 로직을 독립적으로 제어할 수 있으며 스트리머 가 크로스 룸 스트리머의 본 방 내의 업스트림 능력을 변경할 수도 있습니다.

예시 코드

1. 어느 한쪽이 크로스 룸 PK 연결을 발기합니다.
Android
iOS
public void connectOtherRoom(String roomId, String userId) {
try {
JSONObject jsonObj = new JSONObject();
// 문자열 방 번호를 예로 들면, 숫자 방 번호 key는 roomId입니다
jsonObj.put("strRoomId", roomId);
jsonObj.put("userId", userId);
mTRTCCloud.ConnectOtherRoom(jsonObj.toString());
} catch (JSONException e) {
e.printStackTrace();
}
}

// 크로스 룸 연결 신청 결과의 콜백
@Override
public 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 연결의 로컬 사용자와 상대 사용자는 모두 스트리머 역할이어야 하며, 오디오 또는 비디오 업스트림이 모두 있어야 합니다.
두 방의 단일 스트리머 크로스 룸 PK는 한 방의 스트리머만 ConnectOtherRoom을 호출하여 크로스 룸 연결을 설정하면 되며, 양쪽은 다 호출하지 마십시오.
2. 두 방의 모든 사용자는 다른 방의 스크리머로부터 오디오/비디오 스트림 사용 가능 콜백을 받게 됩니다.
Android
iOS
@Override
public void onUserAudioAvailable(String userId, boolean available) {
// 원격 사용자가 자신의 오디오를 게시/취소합니다
// 자동 구독 모드에서는 사용자가 아무런 작업을 하지 않아도 SDK가 원격 사용자의 오디오를 자동으로 재생합니다.
}

@Override
public 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 연결을 종료합니다.
Android
iOS
// 크로스 룸 연결을 종료합니다
mTRTCCloud.DisconnectOtherRoom();

// 크로스 룸 연결 종료 결과의 콜백
@Override
public void onDisConnectOtherRoom(int errCode, String errMsg) {
super.onDisConnectOtherRoom(errCode, errMsg);
}
// 크로스 룸 연결을 종료합니다
[self.trtcCloud disconnectOtherRoom];

// 크로스 룸 연결 종료 결과의 콜백
- (void)onDisconnectOtherRoom:(TXLiteAVError)errCode errMsg:(NSString *)errMsg {
}
주의:
크로스 룸 PK 연결의 발신 측 또는 수신 측 중 어느 한쪽에서 DisconnectOtherRoom을 호출하여 크로스 룸 PK 연결을 종료할 수 있습니다.

서버 측에서의 스트리머 간 크로스 룸 PK 연결 방안

적용 시나리오

여러 방 간의 PK 또는 각 방에 여러 스트리머가 있는 순수 서버 측 크로스 룸 연결 시나리오.

솔루션 원리

서버 측에서 여러 혼합 스트림 전송 작업을 시작하며, 각 전송 작업은 Agent 로봇 사용자를 하나 생성하여 자체 Real-Time Communication Engine (RTC Engine) 방에 참여시켜 스트림을 가져오고, 동시에 하나 혹은 하나 이상의 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 혼합 스트리밍 푸시 작업의 파라미터 예시를 보여줍니다.
작업 1
작업 2
작업 N
{
"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 연결 방안의 비교 및 분석

위에서는 세 가지 다른 스트리머 간 크로스 룸 PK 연결 구현 방안을 소개했으며 각각 다른 시나리오에 적용됩니다. 아래에서는 네 가지 차원으로 다른 크로스 룸 연결 방안을 비교및 분석합니다.
솔루션 유형
솔루션 장점
솔루션 단점
방 및 인원의 제한
추천 사용 시나리오
두 사람 PK 호출 로직이 간단합니다
여러 사람 PK 호출 로직이 복잡합니다
단일 스트리머는 최대 다른 방의 9명 스트리머와 크로스 룸 PK가 가능합니다
두 개의 방 또는 단일 스트리머(2명) 크로스 룸 PK
순수 서버 측 방안, 클라이언트는 추가 처리 불필요합니다
추가적인 로봇으로 스트리밍 푸시/풀 및 혼합 스트리밍 비용이 존재합니다
최대 11개의 방에서 동시에 크로스 룸 PK를 진행할 수 있으며 각 방은 최대 16명의 스트리머가 동시에 크로스 룸 PK에 참여할 수 있습니다.
여러 방, 여러 스트리머(여러 명) 간의 크로스 룸 PK, 순수 서버 측 관리