You need to enable JavaScript to run this app.
导航
订阅模式设置
最近更新时间:2024.07.31 14:33:34首次发布时间:2022.08.04 15:33:52

RTC 提供了进房自动订阅的默认选项。此时,RTC SDK 会自动帮助你处理房间内音视频流的订阅关系。我们强烈推荐你使用此配置。
如果你希望自行实现进房订阅音视频流的逻辑,参考本文,完成设置。

API 介绍

在使用 RTC 的订阅功能时,你可能会用到以下 API:

方法简述

joinRoom 参数 RTCRoomConfig的成员变量:

  • isAutoSubscribeAudio

  • isAutoSubscribeVideo

房间参数配置

  • 进房是否自动订阅音频流,默认自动订阅
  • 进房是否自动订阅视频流,默认自动订阅
subscribeStream订阅房间内指定的通过摄像头/麦克风采集的媒体流
subscribeAllStreams订阅房间内所有通过摄像头/麦克风采集的媒体流
unsubscribeStream停止订阅房间内指定的通过摄像头/麦克风采集的媒体流
unsubscribeAllStreams停止订阅房间内所有通过摄像头/麦克风采集的媒体流
pauseAllSubscribedStream暂停订阅来自远端的媒体流
resumeAllSubscribedStream恢复订阅来自远端的媒体流
订阅媒体流

对于媒体流的订阅,RTC 提供自动和手动两种订阅模式,大多数场景下,你都可以使用自动订阅模式进行通话

自动订阅

自动订阅为 SDK 的默认设置,加入房间后 SDK 会自动帮你订阅房间内其他用户的流,视频流数没有上限,音频流数上限为 30 路,超过 30 路时,我们推荐你开启音频选路功能,具体参看场景二:音频选路
若你希望单独控制音频或视频流的自动订阅,则可以在 joinRoom 时对 RTCRoomConfig 进行如下设置:

  • 设置 isAutoSubscribeAudio=falseisAutoSubscribeVideo=true ,则进房后仅自动订阅视频;

  • 设置 isAutoSubscribeVideo=falseisAutoSubscribeAudio=true,则进房后仅自动订阅音频。

修改自动订阅

通话过程中,你可能需要切换通话场景(如纯音频通话切换至视频通话),或者更换订阅的远端用户,此时你需要调用相应 API 对之前的订阅设置进行修改。

修改订阅的流属性

  • 视频通话切换语音通话

Step 1: 调用 joinRoom 进房时,使用自动订阅模式
Step 2: 进房后当需要切换时调用 pauseAllSubscribedStream(RTC_PAUSE_RESUME_CONTROL_VIDEO) 停止订阅全部远端视频,仅接收音频

  • 语音通话切换视频通话

Step 1: 调用 joinRoom 进房时,使用自动订阅模式
Step 2: 进房后立刻调用 pauseAllSubscribedStream(RTC_PAUSE_RESUME_CONTROL_VIDEO) 暂停订阅全部远端视频,仅接收音频
Step 3: 当需要切换时,调用 resumeAllSubscribedStream(RTC_PAUSE_RESUME_CONTROL_VIDEO) 恢复订阅全部远端视频

修改订阅用户

自动订阅模式下,修改订阅用户参看暂停/恢复订阅媒体流

手动订阅

当通话人数较多,或者你希望仅接收需要的音频/视频流时,我们推荐你使用手动订阅模式。手动订阅模式下,你可以指定某个/某些远端用户的音频/视频流进行订阅,SDK 仅会向你推送你订阅的流。

  • 当你需要手动订阅音频时:

Step 1: 调用 joinRoom 加入房间,将 RTCRoomConfig 中的 isAutoSubscribeAudio 设为 false
Step 2: 通过 onUserPublishStream 回调中的 uid 判断当前房间内有哪些用户发布了音频流
Step 3: 调用 subscribeStream(uid, RTC_MEDIA_STREAM_TYPE_AUDIO) 订阅你需要的音频流

  • 当你需要手动订阅视频时:

Step 1: 调用 joinRoom 加入房间,将 RTCRoomConfig 中的 isAutoSubscribeVideo 设为 false
Step 2: 通过 onUserPublishStream 回调中的 uid 判断当前房间内有哪些用户发布了视频流
Step 3: 调用 subscribeStream(uid, RTC_PAUSE_RESUME_CONTROL_VIDEO) 订阅你需要的视频流

注意:屏幕视频流始终为自动订阅,若不需要,你可以在进房后调用 unsubscribeStream 停止订阅

  • 当你需要手动同时订阅音视频时:

Step 1: 调用 joinRoom加入房间,将 RTCRoomConfig 中的 isAutoSubscribeAudioisAutoSubscribeVideo 均设为 false
Step 2: 通过 onUserPublishStream 回调中的 uid 判断当前房间内有哪些用户发布了音视频流
Step 3: 调用 subscribeStream(uid, RTC_MEDIA_STREAM_TYPE_BOTH) 订阅你需要的音视频流

修改手动订阅

修改订阅的流属性

  • 视频通话切换语音通话

Step 1: 参考手动订阅中同时订阅音视频的步骤开始视频通话
Step 2: 当需要切换时调用 unsubscribeStream(uid, RTC_PAUSE_RESUME_CONTROL_VIDEO) 停止订阅视频

  • 语音通话切换视频通话

Step 1: 调用 joinRoom 加入房间,将 RTCRoomConfig 中的 isAutoSubscribeAudioisAutoSubscribeVideo 均设为 false
Step 2: 通过 onUserPublishStream 回调中的 uid 判断当前房间内有哪些用户发布了音频流
Step 3: 调用 subscribeStream(uid, RTC_MEDIA_STREAM_TYPE_AUDIO) 订阅你需要的音频流
Step 4: 当需要切换时,通过 onUserPublishStream 判断该用户是否发布视频
Step 5: 调用 subscribeStream(uid, RTC_PAUSE_RESUME_CONTROL_VIDEO) 订阅视频

修改订阅用户

以视频通话场景为例,由订阅 A 用户切换到订阅 B 用户的操作如下:
Step 1: 参考手动订阅中同时订阅音视频的步骤开始视频通话
Step 2: 调用 unsubscribeStream(A, RTC_MEDIA_STREAM_TYPE_BOTH) 停止订阅 A 用户的流
Step 3: 通过 onUserPublishStream 回调中的 uid 判断 B 用户是否发布了音视频流
Step 4: 调用 subscribeStream(B, RTC_MEDIA_STREAM_TYPE_BOTH) 订阅 B 用户的流

停止/恢复订阅媒体流

通话过程中,你可能会不再需要接收远端用户的音/视频流,或者恢复之前暂停订阅的流,无论当前是手动订阅还是自动订阅模式,你都可以调用 API 实现上述功能:

  • 停止/恢复订阅指定远端用户的流

进房后调用 unsubscribeStream 可停止订阅指定远端用户;若想恢复订阅该用户的流,需调用 subscribeStream 输入相同的 uid 即可。

注意:恢复订阅前,若收到带有该用户 uid 的 onUserUnpublishStream 回调,则表示该用户已取消发布流,此时需监听该用户的 onUserPublishStream 回调,等待流重新发布后,方可调用 subscribeStream 进行订阅。

  • 暂停/恢复订阅所有远端用户的流

进房后调用 pauseAllSubscribedStream 可在暂停订阅全部远端用户的流;调用 resumeAllSubscribedStream 则恢复之前订阅的流。

注意:在手动订阅模式下,调用 resumeAllSubscribedStream 后,依旧只会收到 pauseAllSubscribedStream 前订阅的流。

其他推荐设置

场景一:通话打断和恢复

当你在进行实时音视频通话的过程中,可能会被系统电话、第三方应用、或其他系统行为打断,此时你需要关注打断和恢复时远端音视频播放状态,并修改订阅相关设置,具体参看通话打断和恢复

场景二:音频选路

在某些大型会议、互动娱乐场景下,同一房间内可能会有数千用户需要同时参与音视频互动。当无需指定订阅时,我们推荐你通过控制台选择开启音频选路功能。开启后,房间中用户的音频订阅关系将交由 RTC 智能托管,RTC 将智能向你推送房间中音量较大的部分用户的流。
该场景下,我们仍建议你选择自动订阅模式,以保证能够接收到被选中的流。此外,该模式支持调用 unsubscribeStream 取消订阅流,调用后,即使取消订阅的流被选中,你也不会收到此流。
更多音频选路的详细说明参看音频选路

各平台 API 参考
AndroidWindows/LinuxiOS/macOS
joinRoomjoinRoomjoinRoom:userInfo:roomConfig:
subscribeStreamsubscribeStreamsubscribeStream:mediaStreamType:
unsubscribeStreamunsubscribeStreamunsubscribeStream:mediaStreamType:
pauseAllSubscribedStreampauseAllSubscribedStreampauseAllSubscribedStream:
resumeAllSubscribedStreamresumeAllSubscribedStreamresumeAllSubscribedStream: