You need to enable JavaScript to run this app.
导航
订阅模式设置
最近更新时间:2025.11.12 10:44:35首次发布时间:2022.08.04 15:33:52
复制全文
我的收藏
有用
有用
无用
无用

在实时音视频互动中,用户进入 RTC 房间后,如果希望收看其他用户的视频、共享桌面,收听音频,都需要订阅相应的媒体流。根据参与人数和玩法,对订阅关系通常有不同的要求。本文提供了在不同场景下,如何在客户端订阅媒体流。

本文适用于 V3.60 及之后版本 SDK。

功能说明

  • 订阅媒体流
    你需要订阅房间内已发布的媒体流,以便收听到其他用户的音频,收看其他用户的视频。媒体流包括麦克风采集的音频流和摄像头采集的视频流,也包括共享屏幕的视频和音频流。
  • 设置订阅模式
    你可以在加入房间时,选择自动订阅或者手动订阅模式。在加入房间后,可以通过 subscribeAllStreamsAudiosubscribeAllStreamsVideo,修改订阅模式。
    • 自动订阅:SDK 会自动订阅房间内已发布的媒体流。
      • 用户加入房间时,自动订阅房间内正在发布的音频流。
      • 当其他用户加入房间并发布音视频流时,自动订阅新增的音视频流。
    • 手动订阅:和自动订阅相反,你需要通过调用接口,手动订阅指定的媒体流。

场景一:在线教育

在线课堂上,通常不允许自由发言,需要限制用户发言顺序。在此类场景下,你可以通过以下方式进行处理:

  1. 调用 joinRoom 加入房间,选择用户可见并设置自动发布和手动订阅模式。
// 用户可发布流
boolean userVisibility = true;
// 自动发布
boolean isPublishAudio = true;
boolean isPublishVideo = true;
// 手动订阅音频
boolean isAutoSubscribeAudio = false;
// 自动订阅视频
boolean isAutoSubscribeVideo = true;
RTCRoomConfig roomConfig = new RTCRoomConfig(ChannelProfile.CHANNEL_PROFILE_CHAT_ROOM, isPublishAudio, isPublishVideo, isAutoSubscribeAudio, isAutoSubscribeVideo);
// 加入房间
rtcRoom1.joinRoom(token, userInfo, userVisibility, roomConfig);
  1. 手动订阅教师发布的音频流。
rtcRoom1.subscribeStreamAudio(user_id_1, true);
  1. 手动订阅上台发言用户的音频流。发言结束后,取消订阅对该用户的订阅。
//订阅学生发布的音频流
rtcRoom1.subscribeStreamAudio(user_id_2, true);
//发言结束,取消订阅
rtcRoom1.subscribeStreamAudio(user_id_2, false);

场景二:通话打断和恢复

在实时音视频通话的过程中,音视频模块可能会被系统电话、第三方应用、或其他系统行为打断,此时你需要关注打断和恢复时远端音视频播放状态,具体参看通话打断和恢复。对于无法自动恢复的打断,你可以通过以下方式进行处理:

  1. 用户开始使用系统或第三方应用,并且该应用会占用设备的音视频模块时,调用 pauseAllSubscribedStreamVideo 和/或 pauseAllSubscribedStreamAudio 暂停订阅所有用户的视/音频流。
  2. 用户结束使用系统或第三方应用时,调用 resumeAllSubscribedStreamVideo 和/或 resumeAllSubscribedStreamAudio 恢复占用前的订阅关系。

场景三:通话期间的场景切换

在实时音视频通话过程中,可能需要进行通常场景切换。比如,为增加互动和趣味性,在语聊场景下增加了 K 歌抢唱环节。用户通过点击按钮抢占麦克风成功后,房间中的其他用户,都需要订阅该用户。

  1. 调用 joinRoom 加入房间,选择用户可见并设置自动发布和自动订阅模式。用户进房后,自动订阅房间内所有流,进行语聊通话。
// 用户可发布流
boolean userVisibility = true;
// 自动发布语音
boolean isPublishAudio = true;
// 语聊房不需要发布视频
boolean isPublishVideo = false;
// 自动订阅语音
boolean isAutoSubscribeAudio = true;
// 语聊房不需要订阅视频
boolean isAutoSubscribeVideo = true;
RTCRoomConfig roomConfig = new RTCRoomConfig(ChannelProfile.CHANNEL_PROFILE_CHAT_ROOM, isPublishAudio, isPublishVideo, isAutoSubscribeAudio, isAutoSubscribeVideo);
// 加入房间
rtcRoom1.joinRoom(token, userInfo, userVisibility, roomConfig);
  1. K 歌抢唱环节开始,用户 A 抢占麦克风成功后,房间所有用户,先调用 subscribeAllStreamsAudio 取消订阅房间内所有流,房间内其他用户,调用 subscribeStreamAudio 手动订阅用户 A 的流。
  2. 抢唱环节结束,房间内所有用户,调用 subscribeAllStreamsAudio 订阅房间内所有流,继续语聊通话。

场景四:音频选路

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

API 参考

你可以通过灵活组合使用以下 API,实现更多音视频互动玩法。

描述AndroidiOSmacOSWindowsLinux
加入 RTC 房间joinRoomjoinRoom:userInfo:userVisibility:roomConfig:joinRoom:userInfo:userVisibility:roomConfig:joinRoomjoinRoom
订阅/取消订阅房间内指定的视频流,通过摄像头采集subscribeStreamVideosubscribeStreamVideo:subscribe:subscribeStreamVideo:subscribe:subscribeStreamVideosubscribeStreamVideo
订阅/取消订阅房间内指定的音频流,麦克风采集subscribeStreamAudiosubscribeStreamAudio:subscribe:subscribeStreamAudio:subscribe:subscribeStreamAudiosubscribeStreamAudio
订阅/取消订阅房间内所有视频流subscribeAllStreamsVideosubscribeAllStreamsVideo:subscribeAllStreamsVideo:subscribeAllStreamsVideosubscribeAllStreamsVideo
订阅/取消订阅房间内所有音频流subscribeAllStreamsAudiosubscribeAllStreamsAudio:subscribeAllStreamsAudio:subscribeAllStreamsAudiosubscribeAllStreamsAudio
暂停订阅来自远端的视频流pauseAllSubscribedStreamVideopauseAllSubscribedStreamVideopauseAllSubscribedStreamVideopauseAllSubscribedStreamVideopauseAllSubscribedStreamVideo
暂停订阅来自远端的音频流pauseAllSubscribedStreamAudiopauseAllSubscribedStreamAudiopauseAllSubscribedStreamAudiopauseAllSubscribedStreamAudiopauseAllSubscribedStreamAudio
恢复订阅来自远端的视频流resumeAllSubscribedStreamVideoresumeAllSubscribedStreamVideoresumeAllSubscribedStreamVideoresumeAllSubscribedStreamVideoresumeAllSubscribedStreamVideo
恢复订阅来自远端的音频流resumeAllSubscribedStreamAudioresumeAllSubscribedStreamAudioresumeAllSubscribedStreamAudioresumeAllSubscribedStreamAudioresumeAllSubscribedStreamAudio

常见问题

1. 暂停订阅媒体流期间,是否会继续计费?

Q: 不会。无论是取消订阅媒体流,或通过 pauseAllSubscribedStreamVideopauseAllSubscribedStreamAudio 暂停订阅媒体流,暂停期间该用户不会产生订阅媒体流的计费。

2. 暂停订阅媒体流和取消订阅媒体流的区别是什么,如何选择?

Q: 暂停(pauseALlSubscribeStreamVideopauseAllSubscribeStreamAudio,以下简称暂停订阅全部)和取消订阅全部媒体流(subscribeAllStreamsVideosubscribeAllStreamsAudio,以下简称取消订阅全部)都可以实现暂停已订阅的媒体流。

  • 暂停和恢复订阅全部媒体流(resumeALlSubscribeStreamVideoresumeAllSubscribeStreamAudio,以下简称恢复订阅全部)接口必须成对使用。而订阅全部接口可以单独使用。
  • 调用恢复订阅全部接口后,将恢复到调用暂停全部媒体流接口之前的订阅状态。而订阅全部媒体流接口既更新了用户在房间中的自动订阅状态,还同时订阅房间内所有流。

因此,暂停订阅全部和恢复订阅全部适用于需要在暂停后需要继续订阅的场景,比如 RTC 应用被系统来电打断后恢复音视频互动。你可以通过恢复订阅全部接口直接恢复,无需记录暂停前的订阅关系。
而订阅全部和取消订阅全部接口适用于同一个房间内实现场景切换,比如从自由发言切换到指定用户发言。