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