本文介绍如何订阅和取消订阅远端音视频流
您可以通过调用 setDefaultStreamRecvMode 接口设置订阅模式。⚠️ 注意需要在进入房间前调用该接口,设置才能生效。
BRTC 提供了两种订阅模式:
您可以根据您的实际业务场景来决定采用哪种模式。例如,当房间内人数超过 6 人同时推流时,采用手动订阅模式,以节省每个设备的下行带宽。
虽然手动订阅可以节省下行带宽,但由于发起订阅并渲染播放需要消耗一定时间,因此从接口调用到实际看到(听到),会比自动订阅模式下慢一些。
无论是在手动还是自动订阅模式下,您都可以通过调用接口 muteRemoteAudio 来静音或恢复某个远端用户的声音。
// 静音指定用户userID的音频 [self.brtc muteRemoteAudio:self.viewModel.userID mute:YES]; // 恢复指定用户userID的音频播放 [self.brtc muteRemoteAudio:self.viewModel.userID mute:NO]; // 静音所有远端用户的音频流 [self.brtc muteAllRemoteAudio:YES]; // 恢复播放所有远端用户的音频流 [self.brtc muteAllRemoteAudio:NO];
您可以通过调用接口 startRemoteView 来显示远端用户的视频画面。 startRemoteView 需要您指定几个必要的参数,主要包括:用户ID,流类型以及用来渲染视频画面的视图封装类对象。 其中流类型有三个可选的值,分别是:
⚠️ 注意事项
// 指定渲染远端用户的大流画面(可选) [self.brtc setRemoteVideoStreamType:self.remoteUserID type:BRTCVideoStreamTypeBig]; // 渲染用户的主画面 [self.brtc startRemoteView:self.remoteUserID streamType:BRTCVideoStreamTypeBig view:self.remotePlayView]; // 设置远端视频渲染参数(可选) self.remoteRenderParams = [[BRTCRenderParams alloc] init]; self.remoteRenderParams.fillMode = BRTCVideoFillMode_Fit; [self.brtc setRemoteRenderParams:self.viewModel.userID streamType:BRTCVideoStreamTypeBig params:self.remoteRenderParams]; // 显示远端用户视频后,还可以暂停或恢复 [self.brtc muteRemoteVideoStream:self.remoteUserID streamType:BRTCVideoStreamTypeBig mute:YES or NO];
通过调用 stopRemoteView 接口,您可以停止渲染某一个远端用户的视频。
// 停止拉取此用户的视频流 [self.brtc muteRemoteVideoStream:userID mute:YES]; // 停止渲染此用户的视频画面 [self.brtc stopRemoteView:userID streamType:BRTCVideoStreamTypeBig];
通过 setRemoteRenderParams 您可以设置画面的填充模式、旋转角度和镜像模式。
Fill
Fit
BRTCRenderParams *params = [[BRTCRenderParams alloc] init]; params.rotation = BRTCVideoRotation_0; params.fillMode = BRTCVideoFillMode_Fit; params.mirrorType = BRTCVideoMirrorTypeDisable; [self.brtc setRemoteRenderParams:self.viewModel.userID streamType:BRTCVideoStreamTypeBig params:params];
您可以通过 onUserAudioAvailable 和 onUserVideoAvailable 监听远端用户的音频和视频状态变化。
音频频状态变化通知当远端用户开启或关闭麦克风时,您可以通过监听 onUserAudioAvailable 来感知到这个状态的变化。其中:
视频状态变化通知当收到 onUserVideoAvailable 通知时,表示远端用户的主视频流可用状态发生变化。如需显示,您需要调用 startRemoteView 接口加载该用户的视频画面。
屏幕共享流可用状态通知
当您收到 onUserSubStreamAvailable 通知时,表示远端用户的辅流(通常是屏幕共享)可用状态发生了变化。当变为可用时,startRemoteView 接口加载该用户的辅流画面。其他逻辑与 onUserVideoAvailable 相同。
📝 只有当远端用户调用 startScreenCapture 接口设置的流类型为 BRTCVideoStreamTypeSub 时,您才会收到 onUserSubStreamAvailable 回调通知。
BRTCVideoStreamTypeSub
@interface BRTCVideoForMultipleUsersViewController () <BRTCDelegate> @end @implementation BRTCVideoForMultipleUsersViewController #pragma -mark - 远端用户回调函数 - (void)onRemoteUserEnterRoom:(NSString *)userId { //添加远端用户加入房间处理逻辑 [self appendLog:[NSString stringWithFormat:@"onRemoteUserEnterRoom:%@", userId]]; } - (void)onRemoteUserLeaveRoom:(NSString *)userId reason:(NSInteger)reason { //添加远端用户退出房间处理逻辑 [self appendLog:[NSString stringWithFormat:@"onRemoteUserLeaveRoom:%@, reason:%ld", userId, (long)reason]]; } #pragma -mark - 远端用户发布/取消发布音视频回调函数 - (void)onUserAudioAvailable:(NSString *)userId available:(BOOL)available { //添加远端用户发布/取消音频回调处理逻辑 [self appendLog:[NSString stringWithFormat:@"onUserAudioAvailable:%@, available:%@", userId, available?@"YES":@"NO"]]; } - (void)onUserVideoAvailable:(NSString *)userId available:(BOOL)available { //添加远端用户发布/取消视频回调处理逻辑 [self appendLog:[NSString stringWithFormat:@"onUserVideoAvailable:%@, available:%@", userId, available?@"YES":@"NO"]]; [self.brtc startRemoteView:userId streamType:BRTCVideoStreamTypeBig view:self.remoteView]; } - (void)onUserSubStreamAvailable:(NSString *)userId available:(BOOL)available { //添加远端用户发布/取消屏幕共享回调处理逻辑 [self appendLog:[NSString stringWithFormat:@"brtc回调: 辅流状态回调, userId: %@, available: %d", userId, available]]; } @end
针对播放的远端用户声音,您会发现有三种不同的设置静音方式。虽然他们都可以达到不播放的效果,但是实现机制完全不同。下面解释一下这三种方式的区别:
第一种:调用 muteRemoteAudio:userId mute:YES此时 SDK 会停止拉取该用户的音频数据流,下行的音频流数据变为 0。当您希望再次播放该用户的声音时,SDK 会重新发送信令,请求服务器下发音频数据,这个会消耗一点时间。
muteRemoteAudio:userId mute:YES
第二种:调用 setRemoteAudioVolume这种方法是将某个远端用户的音频数据在混音前清零,从而达到静音的效果。这种方式,拉流并未停止,还会继续占用下行带宽。
第三种:禁用麦克风输出您可以通过 setAudioOutputMute 方法将所有送给 扬声器的混音数据清零,从而达到不播放的效果。这种方式,拉流并未停止,还会继续占用下行带宽。
如果您使用 muteRemoteAudio 或者 setRemoteAudioVolume 来静音,您将无法通过 onPlayAudioFrame 来获取远端用户的音频 PCM 数据,因为他们已经被置为 0 了。而使用 setAudioOnputMute 则不会,他不影响远端用户的原始数据,仅仅是把送给系统扬声器的数据抹零。
综上,如果您不需要监听和使用远端用户的原始音频数据,上面三种方式哪种都可以。
订阅音视频流
本文介绍如何订阅和取消订阅远端音视频流
设定订阅模式
您可以通过调用 setDefaultStreamRecvMode 接口设置订阅模式。
⚠️ 注意需要在进入房间前调用该接口,设置才能生效。
BRTC 提供了两种订阅模式:
您可以根据您的实际业务场景来决定采用哪种模式。例如,当房间内人数超过 6 人同时推流时,采用手动订阅模式,以节省每个设备的下行带宽。
虽然手动订阅可以节省下行带宽,但由于发起订阅并渲染播放需要消耗一定时间,因此从接口调用到实际看到(听到),会比自动订阅模式下慢一些。
音频流的播放
无论是在手动还是自动订阅模式下,您都可以通过调用接口 muteRemoteAudio 来静音或恢复某个远端用户的声音。
视频流的播放
您可以通过调用接口 startRemoteView 来显示远端用户的视频画面。 startRemoteView 需要您指定几个必要的参数,主要包括:用户ID,流类型以及用来渲染视频画面的视图封装类对象。 其中流类型有三个可选的值,分别是:
⚠️ 注意事项
视频流停止播放
通过调用 stopRemoteView 接口,您可以停止渲染某一个远端用户的视频。
设置播放参数
通过 setRemoteRenderParams 您可以设置画面的填充模式、旋转角度和镜像模式。
Fill和Fit两种模式:感知房间中远端用户的音视频状态
您可以通过 onUserAudioAvailable 和 onUserVideoAvailable 监听远端用户的音频和视频状态变化。
音频频状态变化通知
当远端用户开启或关闭麦克风时,您可以通过监听 onUserAudioAvailable 来感知到这个状态的变化。其中:
视频状态变化通知
当收到 onUserVideoAvailable 通知时,表示远端用户的主视频流可用状态发生变化。如需显示,您需要调用 startRemoteView 接口加载该用户的视频画面。
屏幕共享流可用状态通知
当您收到 onUserSubStreamAvailable 通知时,表示远端用户的辅流(通常是屏幕共享)可用状态发生了变化。当变为可用时,startRemoteView 接口加载该用户的辅流画面。其他逻辑与 onUserVideoAvailable 相同。
📝 只有当远端用户调用 startScreenCapture 接口设置的流类型为
BRTCVideoStreamTypeSub时,您才会收到 onUserSubStreamAvailable 回调通知。用户进出房间的通知
播放静音
针对播放的远端用户声音,您会发现有三种不同的设置静音方式。虽然他们都可以达到不播放的效果,但是实现机制完全不同。下面解释一下这三种方式的区别:
第一种:调用
muteRemoteAudio:userId mute:YES此时 SDK 会停止拉取该用户的音频数据流,下行的音频流数据变为 0。当您希望再次播放该用户的声音时,SDK 会重新发送信令,请求服务器下发音频数据,这个会消耗一点时间。
第二种:调用 setRemoteAudioVolume
这种方法是将某个远端用户的音频数据在混音前清零,从而达到静音的效果。这种方式,拉流并未停止,还会继续占用下行带宽。
第三种:禁用麦克风输出
您可以通过 setAudioOutputMute 方法将所有送给 扬声器的混音数据清零,从而达到不播放的效果。这种方式,拉流并未停止,还会继续占用下行带宽。
如果您使用 muteRemoteAudio 或者 setRemoteAudioVolume 来静音,您将无法通过 onPlayAudioFrame 来获取远端用户的音频 PCM 数据,因为他们已经被置为 0 了。而使用 setAudioOnputMute 则不会,他不影响远端用户的原始数据,仅仅是把送给系统扬声器的数据抹零。
综上,如果您不需要监听和使用远端用户的原始音频数据,上面三种方式哪种都可以。