라이브 스트리밍이 보편화되면서 점점 더 많은 기업과 개발자들이 자체 라이브 스트리밍 플랫폼을 구축하고 있습니다. 이 과정에서 라이브 스트림 푸시 및 풀, 라이브 트랜스코딩, 라이브 화면 캡처, 라이브 스트림 믹싱, 라이브 채팅방, 라이브 룸 인터랙션(예: 좋아요, 선물 및 공동 앵커) 및 라이브 룸 상태 관리와 같은 복잡한 요구 사항을 처리해야 합니다. 이 문서에서는 Tencent Cloud 제품(Instant Messaging, Cloud Streaming Services)를 예로 들어 라이브 룸을 구현하는 방법과 가능한 문제 및 고려 사항을 설명하고, 라이브 스트리밍 비즈니스 및 요구 사항을 간략히 안내합니다.
1. 준비 작업
애플리케이션 생성
Tencent Cloud에서 라이브 룸을 설정하려면 아래와 같이 콘솔에서 IM 애플리케이션을 생성해야 합니다.
라이브 스트림 푸시 및 재생 도메인 추가
라이브 룸을 구축하려면 라이브 기능이 필수적이며 CSS를 통해 라이브 기능을 실현할 수 있습니다. 아래 그림과 같이 스트림 푸시 및 재생 도메인을 추가해야 합니다.
준비 작업에서 생성된 애플리케이션은 개발에만 적용되는 무료 버전입니다. 프로덕션 환경에서는 필요에 따라 프로 또는 플래그십 에디션을 활성화해야 합니다. 버전별 차이점에 대한 자세한 내용은 요금 안내를 참고하십시오.
라이브 스트리밍 시나리오에서는 애플리케이션을 생성한 후 몇 가지 추가 구성이 필요합니다.
키로 UserSig 계산하기
IM 계정 시스템에서 사용자 로그인에 필요한 암호는 IM에서 제공한 키를 사용하여 서버에서 계산합니다. 자세한 내용은 Generating UserSig를 참고하십시오. 개발 단계에서 클라이언트의 개발 지연을 방지하기 위해 아래와 같이 콘솔에서 UserSig 계산할 수도 있습니다.
관리자 계정 구성
라이브 스트리밍 중에 관리자는 라이브 룸에 메시지를 보내거나 정책을 준수하지 않는 사용자를 음소거(강제 퇴장)해야 할 수 있습니다. 이 작업은 RESTful APIs를 통해 수행할 수 있습니다. 이러한 API를 호출하려면 IM 관리자 계정 생성을 해야 합니다. 기본적으로 IM은 UserID가 administrator인 계정을 제공합니다. 필요에 따라 여러 관리자 계정을 만들 수도 있으며, 최대 5개의 관리자 계정을 만들 수 있습니다.
콜백 주소 구성 및 콜백 활성화
라이브 룸에서 화면 댓글을 기반으로한 경품 추첨, 메시지 통계 수집, 민감한 콘텐츠 감지 등 요구 사항을 구현하려면 IM 백엔드가 특정 시나리오에서 비즈니스 백엔드를 다시 호출하는 IM 콜백 모듈을 사용해야 합니다. HTTP API를 제공하고 아래와 같이 콘솔 > 콜백 구성 모듈에서 구성하기만 하면 됩니다.
라이브 룸 상태를 자주 가져와야 하는 경우 비즈니스 백엔드에 상태를 저장하면 IM 그룹 프로필에 상태를 저장하는 것보다 IM SDK를 호출하는 빈도가 줄어듭니다. 이 구현 스키마를 사용하면 IM SDK가 통합되지 않은 경우 라이브 룸 상태를 얻을 수 있습니다.
비즈니스 백엔드는 라이브 룸 상태를 읽고 쓰기 위한 추가 모듈을 제공해야 합니다. 데이터는 비즈니스 백엔드와 IM 그룹 프로필 모두에서 가져오기 때문에 라이브 룸 데이터를 가져올 때 예외가 발생할 가능성이 더 큽니다. 사용자 정의 메시지를 보낼 때 손실될 수 있습니다. 많은 수의 메시지가 있는 경우 우선순위가 낮은 메시지가 먼저 삭제되어 라이브 룸 상태 표시에 영향을 줍니다. 따라서 우선순위가 높은 사용자 정의 메시지를 사용하는 것이 좋습니다.
사용자 정의 그룹 필드 또는 그룹 속성을 통해 라이브 룸 상태를 저장하고 클라이언트 SDK의 그룹 속성 변경 콜백을 통해 그룹 사용자에게 알릴 수 있습니다.
라이브 룸 상태를 읽고 쓰기 위한 추가 모듈을 제공할 필요가 없습니다. 이론적으로 그룹 속성 변경에 대한 콜백은 손실되지 않습니다. 라이브 룸 데이터는 예외를 줄이는 통합 데이터 소스 역할을 하는 그룹 프로필에서 가져옵니다.
고노출 모듈에서 그룹 프로필을 자주 가져와야 하므로 IM에 대한 부담이 커집니다. IM SDK 모듈이 통합되지 않은 경우 비즈니스 백엔드에서 IM 서버 SDK를 호출하여 그룹 프로필을 가져와야 하며 호출 수가 제한됩니다.
상기 분석을 바탕으로 라이브 룸 상태를 유지하기 위해 다음 두 가지 스키마를 결합할 것을 권장합니다.
1. 사용자가 자주 그룹에 가입하고 탈퇴하며 그룹 대화 정보(읽지 않은 횟수 및 lastMessage)를 관리할 필요가 없습니다.
2. 사용자는 승인 없이 그룹에 가입할 수 있습니다.
3. 사용자는 채팅 기록에 신경 쓰지 않고 메시지를 보냅니다.
4. 일반적으로 많은 수의 그룹 구성원이 있습니다.
5. 그룹 구성원 정보를 저장할 필요가 없습니다.
따라서 IM의 그룹 특성에 따라 라이브 룸의 그룹 유형으로 오디오/비디오 그룹(AVChatRoom)을 선택할 수 있습니다.
IM 오디오 비디오 그룹(AVChatRoom)은 다음과 같은 특징이 있습니다.
인원 제한이 없으며, 천만 규모의 인터랙티브 라이브 방송 시나리오를 구현할 수 있습니다.
모든 온라인 사용자 대상 푸시 메시지(그룹 시스템 알림)를 지원합니다.
그룹 참여 신청 후 관리자의 승인 없이 바로 참여할 수 있습니다.
설명:
Web용 IM SDK를 사용하면 사용자가 한 번에 하나의 오디오/비디오 그룹(AVChatRoom)에만 참여할 수 있습니다. 사용자가 클라이언트에 로그인하여 라이브 룸 A에 입장하면 콘솔에서 멀티 클라이언트 로그인이 활성화되고 사용자가 다른 클라이언트에 로그인하여 라이브 룸 B에 입장하면 해당 사용자는 라이브 룸 A에서 제거됩니다.
라이브 룸 공지
라이브 룸 공지(토픽)는 각 라이브 룸마다 필요하며, 방에 입장한 후 사용자가 볼 수 있습니다. 또한, 오디오/비디오 그룹 구성원에게 실시간으로 공지 변경 사항을 알려야 합니다. 라이브 룸 상태와 마찬가지로 비즈니스 백엔드 또는 IM 그룹 프로필에 라이브 룸 알림을 저장할 수 있습니다. 그러나 주의가 필요한 몇 가지 추가 사항이 있습니다.
1. 그룹 프로필의 그룹 notification 및 그룹 introduction 필드는 각각 최대 240바이트와 300바이트를 포함할 수 있습니다.
2. 그룹 프로필의 그룹 notification 및 그룹 introduction 필드는 string 유형만 지원합니다. 이미지와 텍스트로 알림을 생성하려면 json string 유형을 사용할 수 있으며 이미지는 온라인 url에 액세스할 수 있어야 합니다.
3. Web에서 editor를 통해 알림을 설정하는 경우, 보다 구체적으로 html 태그를 포함하는 경우 native에서 구문 분석되지 않을 수 있습니다.
라이브룸 알림은 RESTful APIs 또는 클라이언트 SDK의 그룹 속성을 통해 설정할 수 있습니다. 클라이언트는 그룹 속성을 통해 현재 그룹 정보를 얻고 GroupListener에서 OnGroupInfoChange를 수신하여 변경된 그룹 속성을 가져옵니다.
라이브 룸에는 많은 수의 사용자 메시지가 있습니다. 각 사용자는 자주 메시지를 보낼 수 있습니다. 전송된 메시지 수가 IM 빈도 제어 임계값에 도달하면 IM 백엔드는 시스템 실행 안정성을 보장하기 위해 일부 메시지를 삭제합니다. 클라이언트의 메시지 수신 빈도가 너무 높으면 메시지의 가독성이 떨어질 수 있으므로 이러한 임계값을 적용해야 합니다.
그룹 메시지에는 세 가지 우선순위가 있으며 백엔드는 우선순위가 높은 메시지를 먼저 전달합니다. 따라서 중요도에 따라 메시지에 대해 다른 우선순위를 설정하십시오.
다음은 3가지 우선순위를 높음에서 낮음 순으로 나열한 것입니다.
우선순위
설명
High
높은 우선순위
Normal
중간 우선순위
Low
낮은 우선순위
메시지는 다음 정책에 따라 삭제됩니다.
총 메시지 수에 대한 빈도 제어는 그룹에서 초당 보낼 수 있는 메시지 수를 제한합니다. 기본적으로 값은 40건/초입니다. 값을 초과하면 백엔드에서 우선순위가 높은 메시지를 먼저 전달하고 우선순위가 같은 메시지를 랜덤으로 전달합니다.
// 그룹 채팅에 적용되는 메시지 우선순위(v2.4.2 이상에서 지원). 그룹의 메시지가 빈도 제한을 초과하면 백엔드가 우선순위가 높은 메시지를 먼저 전달합니다. 자세한 내용 참고: https://cloud.tencent.com/document/product/269/3663#.E6.B6.88.E6.81.AF.E4.BC.98.E5.85.88.E7.BA.A7.E4.B8.8E.E9.A2.91.E7.8E.87.E6.8E.A7.E5.88.B6)
온라인 지속 시간을 계산하기 위해 Info의 필드를 기반으로 사용자 온라인 상태를 식별할 수 있습니다. 모든 필드에 대한 자세한 내용은 State Change Callbacks를 참고하십시오.
설명:
또한, 라이브 룸 인기도를 표시하여 라이브 룸 추천의 기준으로 활용하는 경우가 많습니다. 사용자 수준과 유사하게 결정되며 IM의 콜백 시스템을 통해 구현할 수 있습니다.
라이브 룸의 메시지 기록
오디오/비디오 그룹(AVChatRoom)에 대한 메시지 기록은 기본적으로 저장되지 않습니다. 새로운 사용자가 라이브 룸에 입장하면 해당 사용자는 입장 후 보낸 메시지만 볼 수 있습니다. 사용자 경험을 최적화하기 위해 아래와 같이 가져올 수 있는 메시지 기록 수를 구성할 수 있습니다.
설명:
이 기능은 플래그십 에디션에서만 사용할 수 있으며 지난 24시간 동안 최대 20개의 메시지 기록을 가져올 수 있습니다.
라이브 룸이 하나뿐이라면 클라이언트 SDK의 API를 통해 온라인 사용자 수를 풀링하기에 충분합니다. 온라인 사용자 수를 표시하기 위해 많은 노출 위치가 필요한 라이브 룸이 여러 개 있는 경우 두 번째 스키마를 권장합니다.
설명:
서버는 예를 들어 5초마다 한 번씩 스케쥴된 방식으로 온라인 사용자 수 통계 메시지를 클라이언트에 보낼 수 있습니다. 그러나 라이브 룸의 온라인 사용자 수가 급격히 변경되지 않으면 추가 네트워크 오버헤드가 발생합니다. 변경률을 모니터링하여 숫자를 업데이트하는 것이 좋습니다.
필요에 따라 라이브 룸의 온라인 사용자 수의 정확성과 실시간성의 우선순위를 결정할 수 있습니다.
라이브 룸 관리자가 백엔드에서 그룹 음소거를 설정할 때 클라이언트는 콜백 이벤트를 수신한 후 타깃 사용자의 입력 상자를 disable 상태로 설정해야 합니다. 그렇지 않으면 사용자는 메시지를 보낼 때 메시지 전송 실패 프롬프트를 받게 됩니다. 사용자의 음소거가 해제되면 클라이언트도 입력 상자를 enable 상태로 설정해야 합니다.
라이브 룸에서 민감한 콘텐츠를 필터링하는 것은 다음과 같이 구현할 수 있는 또 다른 중요한 기능입니다.
1. 그룹 메시지를 보내기 전에 콜백을 바인딩합니다.
2. 콜백 데이터를 기반으로 메시지 유형을 식별하고 메시지 데이터를 Tianyu 또는 다른 타사 점검 서비스에 전달합니다.
3. 메시지가 일반 문자 메시지인 경우 Tianyu의 점검 결과를 기다렸다가 메시지를 IM 백엔드로 전달할지 여부를 나타내는 데이터 패킷을 반환합니다.
4. 메시지가 리치 미디어 메시지인 경우 메시지를 IM 백엔드로 전달하기 위한 데이터 패킷을 반환합니다. Tianyu가 비동기 결과를 반환한 후 메시지가 규정 위반으로 식별되면 메시지 편집 API 또는 사용자 정의 그룹 메시지 API를 통해 메시지 변경 알림을 전달합니다. 알림을 받은 후 클라이언트는 규정 위반 메시지를 차단합니다.
메시지 전송 전 콜백의 예시 데이터:
{
"CallbackCommand":"Group.CallbackBeforeSendMsg",// 콜백 명령
"GroupId":"@TGS#2J4SZEAEL",// 그룹 ID
"Type":"Public",// 그룹 유형
"From_Account":"jared",// 발신자
"Operator_Account":"admin",// 요청 개시자
"Random":123456,// 랜덤 숫자
"OnlineOnlyFlag":1,// 값은 온라인 메시지인 경우 1이고 그렇지 않은 경우 0(기본값)입니다. 오디오/비디오 그룹의 경우 값은 0입니다.
"MsgBody":[// 메시지 본문, 자세한 내용은 TIMMessage 메시지 객체 참고
규정 위반 메시지를 특정 방식으로 처리하도록 선택할 수 있으며, 이는 IM 백엔드로 반환되는 콜백의 데이터 패킷을 통해 구현할 수 있습니다.
{
"ActionStatus":"OK",
"ErrorInfo":"",
"ErrorCode":0// 다른 ErrorCode 값은 다른 의미를 갖습니다.
}
ErrorCode
설명
0
발언 허용, 메시지 전달 가능
1
발언 거부, 클라이언트 10016 반환
2
자동 폐기가 활성화되고 클라이언트가 메시지를 정상적으로 반환
필요에 따라 사용할 수 있습니다.
민감한 콘텐츠 감지 순서도는 다음과 같습니다.
라이브 룸의 그룹 구성원 목록
getGroupMemberList API를 호출하여 표시할 라이브 룸의 온라인 그룹 구성원 목록을 가져올 수 있습니다. 오디오/비디오 그룹(AVChatRoom)은 구성원이 많기 때문에 전체 구성원 목록 풀링 기능은 사용할 수 없습니다. 플래그십 에디션과 그 외의 에디션은 설정이 다릅니다.
1. 플래그십 에디션이 아닌 사용자는 getGroupMemberList를 호출하여 최근 30명의 그룹 구성원을 풀링할 수 있습니다.
2. 플래그십 에디션 사용자는 getGroupMemberList를 호출하여 최근 1,000명의 그룹 구성원을 풀링할 수 있습니다. 이 기능은 IM 콘솔에서 활성화해야 합니다. 활성화되지 않은 경우 플래그십 이외 기타 에디션에서와 같이 최근 30명의 그룹 구성원만 풀링합니다.
콘솔의 구성은 다음 이미지 2.6과 같습니다.
플래그십 에디션 사용자가 아닌 경우 getGroupMemberList와 그룹 수신의 onGroupMemberEnter 및 onGroupMemberQuit 콜백을 통해 클라이언트의 온라인 그룹 구성원 목록을 유지할 수 있습니다. 단, 사용자가 라이브룸을 나간 후 다시 입장한 후에는 최근 30명의 그룹 구성원만 풀링할 수 있습니다.
Android
iOS&Mac
Flutter
Web
// filter 매개변수를 통해 그룹 소유자의 프로필을 풀링하도록 지정
int role =V2TIMGroupMemberFullInfo.V2TIM_GROUP_MEMBER_FILTER_OWNER;
스트림을 가져오려면 재생 주소를 구성해야 하며, 이는 재생 설정을 따라 생성하거나 주소 생성기를 통해 생성할 수 있습니다. SDK 액세스 과정에 대한 자세한 내용은 재생을 참고하십시오.
라이브 디렉터
라이브 스트리밍에 대한 더 많은 요구 사항을 충족하기 위해 라이브 디렉터를 사용하여 라이브 스트림을 처리할 수 있습니다. 현재 라이브 디렉터는 다음 기능을 지원합니다.
1.1 워터마크, 텍스트 및 전환
1.2 라이브 스트리밍을 위한 VOD
1.3 라이브 스트리밍을 위한 정의, 비트레이트 및 해상도 설정
1.4 라이브 스트리밍을 위한 레이아웃 조정
1.5 라이브 녹화
1.6 실시간 화면 댓글 추가
1.7 라이브 스트림 모니터링
고급 기능 더보기
CSS는 푸시/풀 스트림 서비스 외에도 다음과 같은 고급 기능이 있습니다.
1.1 라이브 리먹싱 및 트랜스코딩, 독점적인 초고속 고화질 트랜스코딩 기술로, 시나리오 동적 인코딩을 지능적으로 인식하고 라이브 고화질 저코드 및 화질 향상을 실현합니다.
1.2 타임 시프트, 라이브 방송 중 하이라이트 영상을 일시 중지 및 다시 볼 수 있도록 지원합니다.
1.3 라이브 방송 녹화, 라이브 방송 중 동기화 녹화 및 저장이 가능하여 녹화된 비디오의 후속 편집 및 재전파에 편리합니다.
1.4 라이브 방송 워터마크, 생방송 화면에 선명한 워터마크 또는 디지털 워터마크를 겹쳐 영상 도난 방지 효과를 실현합니다.
1.5 클라우드 혼합 스트림, 설정한 혼합 스트림 레이아웃에 따라 다양한 경로의 입력 소스를 새로운 스트림으로 동기식으로 혼합하여 라이브 인터랙션 효과를 실현할 수 있습니다.
1.6 릴레이, 다른 플랫폼의 라이브 또는 VOD 비디오를 라이브 방송 형태로 배포할 수 있으며, 컨텐츠 풀링 및 푸시 기능을 제공하고,기존 라이브 방송이나 영상을 대상 주소로 푸시합니다.
4. FAQ
1. CSS를 테스트할 수 있나요?
CSS 서비스를 활성화한 신규 사용자에게는 1년간 유효한 20GB의 트래픽이 무료로 제공됩니다. 이때 테스트에 의해 발생하는 트래픽은 이를 이용하여 차감할 수 있으며, 패키지를 초과하는 부분은 후불 일 결산 방식으로 과금됩니다. 동시에 라이브 방송 워터마크, 트랜스코딩, 녹화, 화면 캡처, 음란물 감지 등과 같은 라이브 방송 부가 기능을 사용할 수도 있습니다. 부가 기능은 기본적으로 비활성화되어 있으며, 필요에 따라 사용 및 과금됩니다. 기능에 대한 자세한 내용은 제품 개요를 참고하십시오.
2. 라이브 방송은 접속 인원 수 제한이 있습니까?
기본적으로 CSS는 네트워크 및 기타 조건이 허용하는 한 라이브 스트림의 온라인 시청자 수를 제한하지 않습니다. 그러나 대역폭 제한을 설정한 경우 기존 시청자가 너무 많아 대역폭 제한을 초과하면 새로운 시청자가 라이브 스트림을 시청할 수 없습니다. 이 경우 온라인 시청자 수에 제한이 있습니다.
3. 메시지 전송 중 메시지 전송 상태, Message.nick, Message.avatar 필드가 비어 있는 경우 UI에 닉네임과 프로필 사진을 표시하려면 어떻게 해야 하나요?
getUserInfo API를 호출하여 사용자 정보에서 nick 및 avatar 필드를 가져와 메시지 전송 필드로 사용합니다.
4. 메시지가 손실되는 원인은 무엇입니까?
메시지가 손실되는 가능 원인은 다음과 같습니다.
오디오-비디오 그룹에는 초당 40개 메시지의 빈도 제한이 적용됩니다. 메시지 전송 전 콜백과 메시지 전송 후 콜백 수신 여부를 확인할 수 있습니다. 전자는 수신되었지만 후자는 수신되지 않은 경우 빈도 제한으로 인해 메시지가 차단된 것입니다.
자세한 내용은 메시지를 참고하십시오. Web 클라이언트 퇴장으로 인해 Android/iOS/PC 클라이언트가 퇴장되는지 확인합니다.
Web 클라이언트에서 문제가 발생하면 SDK 버전이 v2.7.6 이전인지 확인하십시오. 그렇다면 최신 버전으로 업그레이드하십시오.