直播

本文将介绍如何实现 TRTC_APP_SCENE_LIVE 场景下的直播播放功能。

支持的平台

iOS
Android
Mac OS
Windows
Web
Electron
Flutter

TRTC 场景和角色

在常见的业务场景中,并非所有用户都需要发布流,他们只需要订阅远端用户的流即可。

TRTC 音视频使用场景主要可以分为以下两类:
实时场景(RTC):实时场景下,用户没有角色的差异,但单个房间中同时最多支持 300 人在线,适合于小范围实时通信的场景。
直播场景(LIVE):直播场景下,用户被分成“主播”“观众”两种角色,单个房间中同时最多支持10万人在线,适合于观众人数众多的直播场景。
主播:可以随时发布自己的音视频流,但人数有限制,同一个房间中最多只允许 50 个主播同时发布自己的音视频流。
观众:只能观看其他用户的音视频流,要发布音视频流,需要先通过 switchRole 切换成主播,同一个房间中最多能容纳10万观众。

主播端

在主播端实现音视频的过程与 RTC 场景的实现过程基本相同。
主要区别在于调用enterRoom时传入的两个参数: scene role。参考下面的示例代码:
Android
iOS
Mac
Windows
void enterRoom() {
TRTCCloudDef.TRTCParams trtcParams = new TRTCCloudDef.TRTCParams();
trtcParams.sdkAppId = 1400000123;
trtcParams.userId = "anchor";
trtcParams.roomId = 123321;
trtcParams.userSig = "xxx";
trtcParams.role = TRTCCloudDef.TRTCRoleAnchor; // 以主播角色进入房间

// 对于多人视频通话场景,推荐使用 TRTC_APP_SCENE_LIVE
mCloud.enterRoom(trtcParams, TRTCCloudDef.TRTC_APP_SCENE_LIVE);
}
- (void)enterRoom {
TRTCParams *trtcParams = [[TRTCParams alloc] init];
trtcParams.sdkAppId = 1400000123;
trtcParams.roomId = 123321;
trtcParams.userId = @"anchor";
trtcParams.userSig = @"";
trtcParams.role = TRTCRoleAnchor; // 以主播角色进入房间
// 对于多人视频通话场景,推荐使用 TRTC_APP_SCENE_LIVE
[self.trtcCloud enterRoom:trtcParams appScene:TRTCAppSceneLIVE];
}

-(void)enterRoom {
TRTCParams * trtcParams = [[TRTCParams alloc] init];
trtcParams.sdkAppId = 1400000123;
trtcParams.roomId = 123321;
trtcParams.userId = @"anchor";
trtcParams.userSig = @"";
trtcParams.role = TRTCRoleAnchor; // 以主播角色进入房间
// 对于多人视频通话场景,推荐使用 TRTC_APP_SCENE_LIVE
[self.trtcCloud enterRoom:trtcParams appScene:TRTCAppSceneLIVE];
}
void CLASSNAME::OnBnClickedButton() {
liteav::TRTCParams trtcParams;
trtcParams.sdkAppId = 1400000123;
trtcParams.userId = "denny";
trtcParams.roomId = 123321;
trtcParams.userSig = "xxx";
trtcParams.role = liteav::TRTCRoleAnchor; // 以主播角色进入房间

// 对于多人视频通话场景,推荐使用 TRTC_APP_SCENE_LIVE
trtc_cloud_->enterRoom(trtcParams, liteav::TRTCAppSceneLIVE);
}

观众端

以观众角色进房

以观众角色进入房间,需要将参数 role 设置为 TRTCRoleAudience
Android
iOS
Mac
Windows
void enterRoom() {
TRTCCloudDef.TRTCParams trtcParams = new TRTCCloudDef.TRTCParams();
trtcParams.sdkAppId = 1400000123;
trtcParams.userId = "audience";
trtcParams.roomId = 123321;
trtcParams.userSig = "xxx";
trtcParams.role = TRTCCloudDef.TRTCRoleAudience; // 以观众角色进入房间

// 对于多人视频通话场景,推荐使用 TRTC_APP_SCENE_LIVE
mCloud.enterRoom(trtcParams, TRTCCloudDef.TRTC_APP_SCENE_LIVE);
}
- (void)enterRoom {
TRTCParams *trtcParams = [[TRTCParams alloc] init];
trtcParams.sdkAppId = 1400000123;
trtcParams.roomId = 123321;
trtcParams.userId = @"audience";
trtcParams.userSig = @"";
trtcParams.role = TRTCRoleAudience; // 以观众角色进入房间
// 对于多人视频通话场景,推荐使用 TRTC_APP_SCENE_LIVE
[self.trtcCloud enterRoom:trtcParams appScene:TRTCAppSceneLIVE];
}

-(void)enterRoom {
TRTCParams * trtcParams = [[TRTCParams alloc] init];
trtcParams.sdkAppId = 1400000123;
trtcParams.roomId = 123321;
trtcParams.userId = @"audience";
trtcParams.userSig = @"";
trtcParams.role = TRTCRoleAudience; // 以观众角色进入房间
// 对于多人视频通话场景,推荐使用 TRTC_APP_SCENE_LIVE
[self.trtcCloud enterRoom:trtcParams appScene:TRTCAppSceneLIVE];
}
void CLASSNAME::OnBnClickedButton() {
liteav::TRTCParams trtcParams;
trtcParams.sdkAppId = 1400000123;
trtcParams.userId = "audience";
trtcParams.roomId = 123321;
trtcParams.userSig = "xxx";
trtcParams.role = liteav::TRTCRoleAudience; // 以观众角色进入房间

// 对于多人视频通话场景,推荐使用 TRTC_APP_SCENE_LIVE
trtc_cloud_->enterRoom(trtcParams, liteav::TRTCAppSceneLIVE);
}

播放远端音频

默认情况下,SDK 将会自动播放远端音频,您不需要调用任何 API 播放远端音频。
如果您不需要在进入房间后播放远端音频,可以调用muteRemoteAudio静音某一位远端用户,也可以调用muteAllRemoteAudio静音所有远端用户,参考代码如下:
Android
iOS
Mac
Windows
// 仅静音 anchor 的远端音频
mCloud.muteRemoteAudio("anchor", true);

// 静音所有远端用户
mCloud.muteAllRemoteAudio(true);
// 仅静音 anchor 的远端音频
[self.trtcCloud muteRemoteAudio:@"anchor" mute:YES];

// 静音所有远端用户
[self.trtcCloud muteAllRemoteAudio:YES];
// 仅静音 anchor 的远端音频
[self.trtcCloud muteRemoteAudio:@"anchor" mute:YES];

// 静音所有远端用户
AppDelegate *appDelegate = (AppDelegate *)[[NSApplication sharedApplication] delegate];
[self.trtcCloud muteAllRemoteAudio:YES];
// 仅静音 anchor 的远端音频
trtc_cloud_->muteRemoteAudio("anchor", true);

// 静音所有远端用户
trtc_cloud_->muteAllRemoteAudio(true);
当您需要恢复播放远端音频,参考代码如下:
Android
iOS
Mac
Windows
// 仅取消静音 anchor 的远端音频
mCloud.muteRemoteAudio("anchor", false);

// 取消静音所有远端用户
mCloud.muteAllRemoteAudio(false);
// 仅取消静音 anchor 的远端音频
[self.trtcCloud muteRemoteAudio:@"anchor" mute:NO];

// 取消静音所有远端用户
[self.trtcCloud muteAllRemoteAudio:NO];
// 仅取消静音 anchor 的远端音频
[self.trtcCloud muteRemoteAudio:@"anchor" mute:NO];

// 取消静音所有远端用户
[self.trtcCloud muteAllRemoteAudio:NO];
// 仅取消静音 anchor 的远端音频
trtc_cloud_->muteRemoteAudio("anchor", false);

// 取消静音所有远端用户
trtc_cloud_->muteAllRemoteAudio(false);

播放远端视频

1. 监听 onUserVideoAvailable 事件,可以在进入房间之前接收所有远程用户视频发布事件,当您收到 onUserVideoAvailable(userId, true) 通知时,表示该路画面已经有可播放的视频帧到达。
2. 当已经有可播放的视频帧到达时,调用 startRemoteView 订阅该用户的远程画面。
Android
iOS
Mac
Windows
// 设置本地渲染参数
TRTCCloudDef.TRTCRenderParams trtcRenderParams = new TRTCCloudDef.TRTCRenderParams();
trtcRenderParams.fillMode = TRTCCloudDef.TRTC_VIDEO_RENDER_MODE_FILL; // 渲染模式为填充
trtcRenderParams.mirrorType = TRTCCloudDef.TRTC_VIDEO_MIRROR_TYPE_AUTO; // 镜像类型为自动
mCloud.setLocalRenderParams(trtcRenderParams);

// 播放主播端画面
TXCloudVideoView cameraVideo = findViewById(R.id.txcvv_main_remote);
mCloud.startRemoteView("anchor", TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG, cameraVideo); // 以高清大画面播放 anchor 采集视频内容
// 设置本地预览渲染参数
TRTCRenderParams *trtcRenderParams = [[TRTCRenderParams alloc] init];
trtcRenderParams.fillMode = TRTCVideoFillMode_Fill;
trtcRenderParams.mirrorType = TRTCVideoMirrorTypeAuto;

[self.trtcCloud setLocalRenderParams:trtcRenderParams];

// 播放主播端画面
[self.trtcCloud startRemoteView:@"anchor" streamType:TRTCVideoStreamTypeBig view:self.remoteCameraVideoView];
// 设置本地预览渲染参数
TRTCRenderParams *trtcRenderParams = [[TRTCRenderParams alloc] init];
trtcRenderParams.fillMode = TRTCVideoFillMode_Fill;
trtcRenderParams.mirrorType = TRTCVideoMirrorTypeAuto;

[self.trtcCloud setLocalRenderParams:trtcRenderParams];

// 播放主播端画面
[self.trtcCloud startRemoteView:@"anchor" streamType:TRTCVideoStreamTypeBig view:self.remoteCameraVideoView];
// 播放视频
CWnd* pLocalVideoView = GetDlgItem(AFX_IDC_PICTURE);
if (pLocalVideoView != nullptr) {
auto video_view = (liteav::TXView)(pLocalVideoView->GetSafeHwnd());
trtc_cloud_->startRemoteView("anchor", liteav::TRTCVideoStreamTypeBig, video_view); // 开始播放 anchor 的视频
}

切换角色

由于视频直播和语音聊天室需要支持多达10万名观众同时观看,所以设定了只有主播才能发布自己的音视频的规则。因此,当有些观众希望发布自己的音视频流(以便能跟主播互动)时,就需要先调用 switchRole 把自己的角色切换成主播
Android
iOS
Mac
Windows
// Switch to the anchor
mCloud.switchRole(TRTCCloudDef.TRTCRoleAnchor);

// Turn on mic and camera, then the other anchor in the room will able to receive your audio and video.
mCloud.startLocalAudio(TRTCCloudDef.TRTC_AUDIO_QUALITY_SPEECH);
TXCloudVideoView cameraVideo = findViewById(R.id.txcvv_main_remote); mCloud.startLocalPreview(true, cameraVideo);

// Switch back to the audience when the calling is ended
mCloud.switchRole(TRTCCloudDef.TRTCRoleAudience);
// Switch to the anchor
[self.trtcCloud switchRole:TRTCRoleAnchor];

// Turn on mic and camera, then the other anchor in the room will able to receive your audio and video.
[self.trtcCloud startLocalAudio:TRTCAudioQualitySpeech];
[self.trtcCloud startLocalPreview:self.view];

// Switch back to the audience when the calling is ended
[self.trtcCloud switchRole:TRTCRoleAudience];
// Switch to the anchor
[self.trtcCloud switchRole:TRTCRoleAnchor];

// Turn on mic and camera, then the other anchor in the room will able to receive your audio and video.
[self.trtcCloud startLocalAudio:TRTCAudioQualitySpeech];
[self.trtcCloud startLocalPreview:self.view];

// Switch back to the audience when the calling is ended
[self.trtcCloud switchRole:TRTCRoleAudience];
// Switch to the anchor
trtc_cloud_->switchRole(TRTCRoleAnchor);

// Turn on mic and camera, then the other anchor in the room will able to receive your audio and video.
trtc_cloud_->startLocalAudio(TRTCAudioQualitySpeech);
CWnd* pLocalVideoView = GetDlgItem(AFX_IDC_PICTURE);
if (pLocalVideoView != nullptr) {
auto video_view = pLocalVideoView->GetSafeHwnd();
trtc_cloud_->startLocalPreview(video_view);
}

// Switch back to the audience when the calling is ended
trtc_cloud_->switchRole(TRTCRoleAudience);

联系我们

如果有任何需要或者反馈,您可以联系:info_rtc@tencent.com。