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

Cross-channel media stream relay

Some special scenarios require cross-channel media stream forwarding functionality. Video SDK enables you to relay the media stream of a host, from a source channel, to multiple target channels simultaneously. This functionality allows you to realize the following interactions:

  • The hosts publish and receive each other's audio and video streams while engaging in cross-channel real-time interaction.

  • The audience receive all audio and video streams from hosts and watch multiple hosts interact at the same time.

Due to its real-time and interactive nature, this feature enriches live broadcasts and game-play, It is especially suitable for live scenes such as co-hosting PK and online choir. It provides the audience with a better viewing experience, while bringing more traffic and revenue to the hosts.

Information

Cross-channel media stream relay is included in Agora's policy of 10,000 free minutes every month. For usage beyond the free quota, please refer to Pricing.

Prerequisites

Implement cross-channel media stream relay

The following figure shows the workflow you implement to facilitate cross-channel media stream relay:

CrossChannelMediaStreamForwarding

To implement cross-channel media stream relay in your app, take the following steps:

  1. Start cross-channel media stream relay

    After joining a channel, call startOrUpdateChannelMediaRelay to configure the source and target channel information and start forwarding a media stream.

    // Configure source channel information
    ChannelMediaInfo *m_srcInfo = new ChannelMediaInfo;
    m_srcInfo->channelName = new char[szChannelId.size() + 1];
    strcpy_s(const_cast<char *>(m_srcInfo->channelName), szChannelId.size() + 1,
    szChannelId.data());
    // Note: The token for source channel is different from the token used when joining the source channel.
    // It needs to be regenerated using the source channel name and uid = 0
    m_srcInfo->token = APP_TOKEN;
    // It is recommended to set the uid of the source channel to 0, allowing the SDK to assign a random uid.
    m_srcInfo->uid = 0;

    // Configure destination channel information
    int nDestCount = m_vecChannelMedias.size();
    ChannelMediaInfo *lpDestInfos = new ChannelMediaInfo[nDestCount];
    for (int nIndex = 0; nIndex < nDestCount; nIndex++) {
    lpDestInfos[nIndex].channelName = m_vecChannelMedias[nIndex].channelName;
    lpDestInfos[nIndex].token = m_vecChannelMedias[nIndex].token;
    // Set the uid to 0, allowing the SDK to assign a random uid, or specify your own uid
    // Ensure that it is different from all uids in the target channels
    lpDestInfos[nIndex].uid = m_vecChannelMedias[nIndex].uid;
    }

    ChannelMediaRelayConfiguration cmrc;
    cmrc.srcInfo = m_srcInfo;
    cmrc.destInfos = lpDestInfos;
    cmrc.destCount = nDestCount;
    int ret = 0;
    // Start or update the cross-channel media stream relay
    ret = m_rtcEngine->startOrUpdateChannelMediaRelay(cmrc);
    Copy
    information
    • Best practice is to set the UID of the source channel to 0, allowing the SDK to assign a random UID.
    • The source channel token in srcChannelInfo should be different from the one used when joining the source channel. Generate a new token using the source channel name and uid = 0.
    • For the destination channel, set the uid to 0, to allow the SDK to assign a random uid, or specify a uid, ensuring that it is different from all uids in the target channel.
  2. Update media stream relay channels

    To forward the stream to multiple target channels or exit the current forwarding channel after staring channel media relay, call startOrUpdateChannelMediaRelay again to add or remove target channels for forwarding.

    Note

    The updated configuration completely replaces the previous configuration.

  3. Pause or resume media stream relay

    To pause forwarding the media stream to all target channels, call pauseAllChannelMediaRelay.

    m_rtcEngine->pauseAllChannelMediaRelay();
    Copy

    To resume forwarding the media stream to all target channels, call resumeAllChannelMediaRelay.

    m_rtcEngine->resumeAllChannelMediaRelay();
    Copy
  4. Stop cross-channel media stream relay

    To stop forwarding the media stream, call stopChannelMediaRelay . When forwarding stops, the host exits all target channels.

    m_rtcEngine->stopChannelMediaRelay();
    m_lstInfo.AddString(_T("stopChannelMediaRelay"));
    m_btnStartMediaRelay.SetWindowText(CrossChannelStartMediaRelay);
    Copy
    Information

    If this method fails, you can call leaveChannel to leave the channel, and cross-channel media stream relay will automatically stop.

  5. Listen for cross-channel media stream status changes

    During cross-channel media stream relay, the SDK reports changes in the status of media stream relay through the onChannelMediaRelayStateChanged callback. Implement relevant business logic based on the status codes.

    class CAgoraCrossChannelEventHandler : public IRtcEngineEventHandler {
    virtual void onChannelMediaRelayStateChanged(
    CHANNEL_MEDIA_RELAY_STATE state,
    CHANNEL_MEDIA_RELAY_ERROR code) override {
    if (m_hMsgHanlder)
    ::PostMessage(m_hMsgHanlder,
    WM_MSGID(EID_CHANNEL_MEDIA_RELAY_STATE_CHNAGENED),
    state, code);
    }
    };
    Copy

Development considerations

  • In live broadcast scenarios, only users with the role of a host can call startOrUpdateChannelMediaRelay to initiate cross-channel media stream forwarding.
  • startOrUpdateChannelMediaRelay must be called after successfully joining a channel, or it will result in an error.
  • Within a single channel, multiple hosts can forward the media stream. A single host can forward the media stream to up to 6 target channels.
  • This feature does not support String type uid. If you need to use the cross-channel co-hosting feature, you must also use Integer type uid in regular co-hosting; otherwise, the cross-channel co-hosting feature will not work properly.

Reference

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

Status codes

The main media stream forwarding states and their corresponding status codes are as follows:

Media stream forwarding statusstatus code
The source channel starts transmitting data to the target channel.RELAY_STATE_RUNNING(2) and RELAY_OK(0)
Cross-channel media stream forwarding encounters an exception. You can troubleshoot based on the error code.RELAY_STATE_FAILURE(3)
Media stream forwarding has stopped.RELAY_STATE_IDLE(0) and RELAY_OK(0)

Sample project

Agora provides an open-source CrossChannel sample project for your reference. Download the project or view the source code for a more detailed example.

API reference

Interactive Live Streaming