本文详细介绍如何使用百家云 C++ SDK 订阅和取消订阅远端音视频。
您可以通过调用 setDefaultStreamRecvMode 接口设置订阅模式。⚠️ 注意需要在进入房间前调用该接口,设置才能生效。
BRTC 提供了两种订阅模式:
您可以根据您的实际业务场景来决定采用哪种模式。例如,当房间内人数超过 6 人同时推流时,采用手动订阅模式,以节省每个设备的下行带宽。
虽然手动订阅可以节省下行带宽,但由于发起订阅并渲染播放需要消耗一定时间,因此从接口调用到实际看到(听到),会比自动订阅模式下慢一些。
无论是在手动还是自动订阅模式下,您都可以通过调用接口 muteRemoteAudio 来静音或恢复某个远端用户的声音。
// 静音指定用户 userId 的音频 m_pBrtc->muteRemoteAudio(userId, true); // 恢复指定用户 userId 的音频播放 m_pBrtc->muteRemoteAudio(userId, false); // 静音所有远端用户的音频流 m_pBrtc->muteAllRemoteAudio(true); // 恢复播放所有远端用户的音频流 m_pBrtc->muteAllRemoteAudio(false);
您可以通过调用接口 startRemoteView 来显示远端用户的视频画面。 startRemoteView 需要您指定几个必要的参数,主要包括:用户ID,流类型以及用来渲染视频画面的视图封装类对象。 其中流类型有三个可选的值,分别是:
⚠️ 注意事项
// 恢复指定用户userID的视频流(即通知服务器继续下发视频数据) m_pBrtc->muteRemoteVideoStream(userId, false); // 指定渲染远端用户的大流画面(可选) m_pBrtc->setRemoteVideoStreamType(userId, BRTCVideoStreamTypeBig); // 渲染用户的主画面 m_pBrtc->startRemoteView(userId, BRTCVideoStreamTypeBig, view); // 改变远端用户视频的渲染参数(可选) BRTCRenderParams remoteRenderParams; remoteRenderParams.fillMode = BRTCVideoFillMode_Fit; remoteRenderParams.rotation = BRTCVideoRotation_0; remoteRenderParams.mirrorType = BRTCVideoMirrorTypeDisable; m_pBrtc->setRemoteRenderParams(userId, BRTCVideoStreamTypeBig, remoteRenderParams); // 显示远端用户视频后,还可以暂停或恢复 m_pBrtc->muteRemoteVideoStream(userId, true or false);
通过调用 stopRemoteView 接口,您可以停止渲染某一个远端用户的视频。
m_pBrtc->muteRemoteVideoStream(userId, true); m_pBrtc->stopRemoteView(userId, BRTCVideoStreamTypeBig);
通过 setRemoteRenderParams 您可以设置画面的填充模式、旋转角度和镜像模式。
Fill
Fit
BRTCRenderParams remoteRenderParams; remoteRenderParams.fillMode = BRTCVideoFillMode_Fit; remoteRenderParams.rotation = BRTCVideoRotation_0; remoteRenderParams.mirrorType = BRTCVideoMirrorTypeDisable; m_pBrtc->setRemoteRenderParams(userId, BRTCVideoStreamTypeBig, remoteRenderParams);
您可以通过 onUserAudioAvailable 和 onUserVideoAvailable 监听远端用户的音频和视频状态变化。
音频频状态变化通知当远端用户开启或关闭麦克风时,您可以通过监听 onUserAudioAvailable 来感知到这个状态的变化。其中:
视频状态变化通知当收到 onUserVideoAvailable 通知时,表示远端用户的主视频流可用状态发生变化。如需显示,您需要调用 startRemoteView 接口加载该用户的视频画面。
屏幕共享流可用状态通知
当您收到 onUserSubStreamAvailable 通知时,表示远端用户的辅流(通常是屏幕共享)可用状态发生了变化。当变为可用时,startRemoteView 接口加载该用户的辅流画面。其他逻辑与 onUserVideoAvailable 相同。
📝 只有当远端用户调用 startScreenCapture 接口设置的流类型为 BRTCVideoStreamTypeSub 时,您才会收到 onUserSubStreamAvailable 回调通知。
BRTCVideoStreamTypeSub
class BRTCCore : public BRTCCallback { public: // interface BRTCCallback void onEnterRoom(int result) override; void onExitRoom(uint32_t reason) override; void onUserAudioAvailable(const char* userId, bool available) override; void onUserVideoAvailable(const char* userId, bool available) override; void onStatistics(const BRTCStatistics& statistics) override; void onError(BRTCAVError errCode, const char* errMsg, void* extraInfo) override; private: BRTC* m_pBrtc = nullptr; } void BRTCCore::onRemoteUserEnterRoom(const char* userId) { LOG(INFO) << "a member enter, uid[" << userId << "]"; // 添加远端用户进入房间处理逻辑 } void BRTCCore::onRemoteUserLeaveRoom(const char* userId, uint32_t reason) { LOG(INFO) << "a member exit, uid[" << userId << "], reason[" << reason << "]"; // 添加远端用户退出房间处理逻辑 } void BRTCCore::onUserAudioAvailable(const char* userId, bool available) { LOG(INFO) << "uid[" << userId << "], audio available[" << available << "]"; // 添加用户音频可用/不可用处理逻辑 } void BRTCCore::onUserVideoAvailable(const char* userId, bool available) { LOG(INFO) << "uid[" << userId << "], video available[" << available << "]"; // 添加用户视频可用/不可用处理逻辑 } void BRTCCore::onUserSubStreamAvailable(const char* userId, bool available) { LOG(INFO) << "uid[" << userId << "], screen share available[" << available << "]"; // 添加用户屏幕共享可用/不可用处理逻辑 }
针对播放的远端用户声音,您会发现有几种不同的设置静音方式。虽然他们都可以达到不播放的效果,但是实现机制完全不同。下面解释一下它们的区别:
第一种:调用 muteRemoteAudio(userId, true)此时 SDK 会停止拉取该用户的音频数据流,下行的音频流数据变为 0。当您希望再次播放该用户的声音时,SDK 会重新发送信令,请求服务器下发音频数据,这个会消耗一点时间。
muteRemoteAudio(userId, true)
第二种:调用 setRemoteAudioVolume这种方法是将某个远端用户的音频数据在混音前清零,从而达到静音的效果。这种方式,拉流并未停止,还会继续占用下行带宽。
如果您使用 muteRemoteAudio 或者 setRemoteAudioVolume 来静音,您将无法通过 onPlayAudioFrame 来获取远端用户的音频 PCM 数据,因为他们已经被置为 0 了。
订阅音视频流
本文详细介绍如何使用百家云 C++ SDK 订阅和取消订阅远端音视频。
设定订阅模式
您可以通过调用 setDefaultStreamRecvMode 接口设置订阅模式。
⚠️ 注意需要在进入房间前调用该接口,设置才能生效。
BRTC 提供了两种订阅模式:
您可以根据您的实际业务场景来决定采用哪种模式。例如,当房间内人数超过 6 人同时推流时,采用手动订阅模式,以节省每个设备的下行带宽。
虽然手动订阅可以节省下行带宽,但由于发起订阅并渲染播放需要消耗一定时间,因此从接口调用到实际看到(听到),会比自动订阅模式下慢一些。
音频流的播放
无论是在手动还是自动订阅模式下,您都可以通过调用接口 muteRemoteAudio 来静音或恢复某个远端用户的声音。
视频流的播放
您可以通过调用接口 startRemoteView 来显示远端用户的视频画面。 startRemoteView 需要您指定几个必要的参数,主要包括:用户ID,流类型以及用来渲染视频画面的视图封装类对象。 其中流类型有三个可选的值,分别是:
⚠️ 注意事项
视频流停止播放
通过调用 stopRemoteView 接口,您可以停止渲染某一个远端用户的视频。
设置播放参数
通过 setRemoteRenderParams 您可以设置画面的填充模式、旋转角度和镜像模式。
Fill和Fit两种模式:感知房间中远端用户的音视频状态
您可以通过 onUserAudioAvailable 和 onUserVideoAvailable 监听远端用户的音频和视频状态变化。
音频频状态变化通知
当远端用户开启或关闭麦克风时,您可以通过监听 onUserAudioAvailable 来感知到这个状态的变化。其中:
视频状态变化通知
当收到 onUserVideoAvailable 通知时,表示远端用户的主视频流可用状态发生变化。如需显示,您需要调用 startRemoteView 接口加载该用户的视频画面。
屏幕共享流可用状态通知
当您收到 onUserSubStreamAvailable 通知时,表示远端用户的辅流(通常是屏幕共享)可用状态发生了变化。当变为可用时,startRemoteView 接口加载该用户的辅流画面。其他逻辑与 onUserVideoAvailable 相同。
📝 只有当远端用户调用 startScreenCapture 接口设置的流类型为
BRTCVideoStreamTypeSub时,您才会收到 onUserSubStreamAvailable 回调通知。用户进出房间的通知
播放静音
针对播放的远端用户声音,您会发现有几种不同的设置静音方式。虽然他们都可以达到不播放的效果,但是实现机制完全不同。下面解释一下它们的区别:
第一种:调用
muteRemoteAudio(userId, true)此时 SDK 会停止拉取该用户的音频数据流,下行的音频流数据变为 0。当您希望再次播放该用户的声音时,SDK 会重新发送信令,请求服务器下发音频数据,这个会消耗一点时间。
第二种:调用 setRemoteAudioVolume
这种方法是将某个远端用户的音频数据在混音前清零,从而达到静音的效果。这种方式,拉流并未停止,还会继续占用下行带宽。
如果您使用 muteRemoteAudio 或者 setRemoteAudioVolume 来静音,您将无法通过 onPlayAudioFrame 来获取远端用户的音频 PCM 数据,因为他们已经被置为 0 了。