Join Multiple Channels
Introduction
As of v3.0.0, the Agora Video SDK for Android enables users to join an unlimited number of channels at a time and to receive the audio and video streams of all the channels.
Sample project
Agora provides the following open-source sample projects on GitHub. You can download them and refer to the source code.
Implementation
The SDK uses the RtcChannel and IRtcChannelEventHandler classes to support the multi-channel function.
You can call createRtcChannel multiple times to create multiple RtcChannel objects with different channelId, and then call joinChannel in RtcChannel to join the channel.
The following are the major steps of implementing the multi-channel function:
- Call
createto create and initializeRtcEngine. - Call
setChannelProfileto set the channel profile as live streaming. - Call
createRtcChannelto create anRtcChannelobject with achannelId. - Call
setRtcChannelEventHandlerof theRtcChannelclass to receive callbacks in this channel. - Call
setClientRoleof theRtcChannelclass to set the user role. - Call
joinChannelof theRtcChannelclass to join the channel. After joining a channel, the user publishes the local streams and automatically subscribes to the streams of all the other users in the channel by default. You can set the publishing and subscribing states inChannelMediaOptionswhen joining a channel, and you can change the publishing and subscribing states in the methods with prefixesmuteLocalandmuteRemoteof theRtcChannelclass after joining a channel. - Repeat steps 3, 4, 5, and 6 to join more channels.
API call sequence
Refer to the following API sequence to join multiple channels:
Sample code
The following code demonstrates how to join an RtcChannel channel, and then publish the local streams in the first channel.
- Create and initialize
RtcEngine.
- Enable the video module.
- Set the channel profile as interactive live streaming.
- Create an
RtcChannel1object, and listen for events in this channel.
- Set the user role as a host.
- Pass in
tokenandchannelIdto join theRtcChannel1channel. The SDK publishes the local streams and automatically subscribes to the streams of all the other users in the channel by default.
- Create an
RtcChannel2object, and listen for events in this channel.
- Set the user role as an audience member. Note that audience members cannot publish local streams.
- Pass in
tokenandchannelIdto join theRtcChannel2channel. You need to setpublishLocalAudioandpublishLocalVideotofalse; otherwise, the user fails to join the channel.
- Leave and destroy the
RtcChannel2channel.
- Leave and destroy the
RtcChannel1channel.
- Destroy the
RtcEngineobject.
API reference
Considerations
Subscribing limits
joinChannel in the RtcChannel class provides the media-subscription options (autoSubscribeAudio and autoSubscribeVideo) that determine whether to automatically subscribe to the remote streams after joining the channel. The default setting is to subscribe to all the streams automatically. After a user joins a channel, you can change the subscribing state by calling muteRemoteAudioStream or muteRemoteVideoStream.
If you need to subscribe to the streams of specified users after joining an RtcChannel channel, refer to the following steps:
- Call
joinChanneland setautoSubscribeAudio = falseorautoSubscribeVideo = falseofChannelMediaOptionsto unsubscribe from all remote users. - In the channel, call
muteRemoteAudioStream (uid,false)ormuteRemoteVideoStream(uid,false)to subscribe to specified remote users.
Set the remote video view
In video scenarios, if the remote user joins the channel using RtcChannel, ensure that you specify the channel name of the remote user in VideoCanvas when setting the remote video view.
Publishing limits
The SDK supports publishing local streams to only one channel at a time. Agora recommends setting the user role as an audience when joining a channel where the user do not need to publish streams, and setting publishLocalAudio and publishLocalVideo in ChannelMediaOptions to false when joining the channel.
In the interactive streaming profile, if a user joins the first channel as a host, the SDK publishes local streams in the first channel by default. If the user needs to join a second channel, you need to change the publishing state according to your actual scenario:
- If the user does not need to publish local streams in the second channel, Agora recommends joining the second channel as an audience member (
setClientRole(AUDIENCE)). - If the user needs to publish local streams in the second channel, the user needs to stop publishing in the current channel before joining the second channel. Agora recommends setting the user role as an audience member (
setClientRole(AUDIENCE)) in the first channel and joining the second channel as a host (setClientRole(BROADCASTER)).
If a user publishes local streams in a channel and you call the following methods in a second channel, the method call fails, and the SDK returns -5(ERR_REFUSED):
- Set
publishLocalAudio = trueorpublishLocalVideo = truewhen joining the second channel. - Call
muteLocalAudioStream(false)ormuteLocalVideoStream(false)after joining the second channel. - Call
setClientRole(BROADCASTER).
API changes
As of v3.4.5, the RtcChannel class changes as follows:
- Deprecates
publishandunpublish, and addsmuteLocalAudioStreamandmuteLocalVideoStreaminstead. After joining a channel, you can set the publishing state of the audio stream and video stream separately.muteLocalAudioStreamandmuteLocalVideoStreamin theRtcEngineandRtcChannelclasses control the publishing state of each channel in their respective classes only. - Adds the
publishLocalAudioandpublishLocalVideomembers inChannelMediaOptions. The default value istrue. You can calljoinChannelto join a channel and set the publishing state. If a user publishes streams in a channel, regardless of whether the user is a host or an audience member, they need to setpublishLocalAudioandpublishLocalVideotofalsewhen joining other channels; otherwise, they fail to join the channel. - After calling
setClientRole(BROADCASTER)of theRtcChannelclass, the local user publishes audio and video streams by default. You no longer need to callpublish.
Earlier than v3.4.5:
- Calling
muteLocalAudioStream(true)ormuteLocalVideoStream(true)inRtcEnginetakes effect in channels created by both theRtcEngineandRtcChannelclasses.muteLocalAudioStreamandmuteLocalVideoStreamtake effect when they are called before or after a user joins a channel. joinChannelcannot set the publishing state of local streams.- Calling
setClientRole(BROADCASTER)of theRtcChannelclass does not publish local streams. You also need to callpublish.