直播
支持的平台
iOS | Android | Mac OS | Windows | Web | Electron | Flutter |
✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
TRTC 场景和角色
在常见的业务场景中,并非所有用户都需要发布流,他们只需要订阅远端用户的流即可。
TRTC 音视频使用场景主要可以分为以下两类:
实时场景(RTC):实时场景下,用户没有角色的差异,但单个房间中同时最多支持 300 人在线,适合于小范围实时通信的场景。
直播场景(LIVE):直播场景下,用户被分成“主播”和“观众”两种角色,单个房间中同时最多支持10万人在线,适合于观众人数众多的直播场景。
主播:可以随时发布自己的音视频流,但人数有限制,同一个房间中最多只允许 50 个主播同时发布自己的音视频流。
观众:只能观看其他用户的音视频流,要发布音视频流,需要先通过 switchRole 切换成主播,同一个房间中最多能容纳10万观众。
主播端
在主播端实现音视频的过程与 RTC 场景的实现过程基本相同。
主要区别在于调用
enterRoom
时传入的两个参数: scene 和 role。参考下面的示例代码: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_LIVEmCloud.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_LIVEtrtc_cloud_->enterRoom(trtcParams, liteav::TRTCAppSceneLIVE);}
观众端
以观众角色进房
以观众角色进入房间,需要将参数 role 设置为 TRTCRoleAudience。
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_LIVEmCloud.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_LIVEtrtc_cloud_->enterRoom(trtcParams, liteav::TRTCAppSceneLIVE);}
播放远端音频
默认情况下,SDK 将会自动播放远端音频,您不需要调用任何 API 播放远端音频。
如果您不需要在进入房间后播放远端音频,可以调用
muteRemoteAudio
静音某一位远端用户,也可以调用muteAllRemoteAudio
静音所有远端用户,参考代码如下:// 仅静音 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);
当您需要恢复播放远端音频,参考代码如下:
// 仅取消静音 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 订阅该用户的远程画面。
// 设置本地渲染参数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 把自己的角色切换成主播。
// Switch to the anchormCloud.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 endedmCloud.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 anchortrtc_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 endedtrtc_cloud_->switchRole(TRTCRoleAudience);
联系我们
如果有任何需要或者反馈,您可以联系:info_rtc@tencent.com。