Skip to main content
Android
iOS
macOS
Web
Windows
Electron
Flutter
React Native
React JS
Unity
Unreal Engine
Unreal (Blueprint)

Join multiple channels

Agora Video SDK enables you to simultaneously join multiple channels. This capability allows you to receive and publish audio and video streams across multiple channels concurrently.

Understand the tech

Video SDK's multi-channel functionality is based on two key components:

  • AgoraRtcConnection

    The AgoraRtcConnection object identifies a connection. It contains the following information:

    • Channel name
    • User ID of the local user

    You create multiple AgoraRtcConnection objects, each with a different channel name and user ID. Each AgoraRtcConnection instance can independently publish multiple audio streams and a single video stream.

  • AgoraRtcEngineKit(Ex)

    The class contains methods tailored for interacting with a designated AgoraRtcConnection object.

    To join multiple channels, you call joinChannelExByToken method in the AgoraRtcEngineKit(Ex) class multiple times, using a different AgoraRtcConnection instance each time.

When joining multiple channels:

  • Ensure that the user ID for each AgoraRtcConnection object is unique and nonzero.
  • Configure publishing and subscribing options for the AgoraRtcConnection object in joinChannelExByToken.
  • Pass the AgoraRtcEngineDelegate object to the delegate parameter when calling the joinChannelExByToken method to receive multiple channel-related event notifications.

Prerequisites

Ensure that you have implemented the SDK quickstart in your project.

Implementation

To implement multi-channel functionality, set up each channel as follows:

  1. Define an AgoraRtcConnection object in your project's ViewController.swift file.

    let connection1 = AgoraRtcConnection()
    Copy
  2. Join the channel using a random user ID.

    var mediaOptions = AgoraRtcChannelMediaOptions()
    mediaOptions.autoSubscribeVideo = .of(true)
    mediaOptions.autoSubscribeAudio = .of(true)
    connection1.channelId = channelName1
    connection1.localUid = UInt.random(in: 1001...2000)
    var result = agoraKit.joinChannelEx(byToken: "your token", connection: connection1, delegate: channel1, mediaOptions: mediaOptions, joinSuccess: nil)
    channel1.channelId = channelName1
    channel1.connectionDelegate = self
    if result != 0 {
    self.showAlert(title: "Error", message: "joinChannel1 call failed: \(result), please check your params")
    }
    Copy
  3. Set up the remote video in the didJoinedOfUid callback.

    func rtcEngine(_ engine: AgoraRtcEngineKit, channelId: String, didJoinedOfUid uid: UInt, elapsed: Int) {
    LogUtils.log(message: "remote user join: \(uid) \(elapsed)ms", level: .info)
    // In this operation, only one remote video view is available
    // Here, we check if there's a view tagged with that UID
    let videoCanvas = AgoraRtcVideoCanvas()
    videoCanvas.uid = uid
    // The view to be bound
    videoCanvas.view = channelId == channelName1 ? channel1RemoteVideo.videoView : channel2RemoteVideo.videoView
    videoCanvas.renderMode = .hidden
    let connection = AgoraRtcConnection()
    agoraKit.setupRemoteVideoEx(videoCanvas, connection: connection)
    }
    Copy

Reference

This section contains content that completes the information on this page, or points you to documentation that explains other aspects to this product.

Sample project

Agora offers the JoinMultiChannels open-source sample project for your reference. Download the project or view the source code for a more detailed example.

API reference

Interactive Live Streaming