Cross-channel media stream relay
Updated
Forward the media stream from a source channel to multiple target channels at the same time
Some special use-cases 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.
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
- Ensure that you have implemented the SDK quickstart in your project.
- Contact technical support to activate the cross-channel media stream relay feature.
Implement cross-channel media stream relay
The following figure shows the workflow you implement to facilitate cross-channel media stream relay:
To implement cross-channel media stream relay in your game, take the following steps:
- Start cross-channel media stream relay
After joining the channel, call StartOrUpdateChannelMediaRelay to configure the source and target channel information and start forwarding a media stream.
private void OnStartButtonClick()
{
ChannelMediaRelayConfiguration config = new ChannelMediaRelayConfiguration();
// Configure source channel
config.srcInfo = new ChannelMediaInfo
{
channelName = this._appIdInput.channelName,
uid = 0, // Let the SDK assign a random UID
token = this._appIdInput.token // Regenerate token for source channel with UID 0
};
// Configure target channel (up to 6 supported)
config.destInfos = new ChannelMediaInfo[1];
config.destInfos[0] = new ChannelMediaInfo
{
channelName = this._appIdInput.channelName + "_2",
uid = 0, // Random UID or specify a unique one
token = this._appIdInput.token
};
config.destCount = 1;
// Start media stream forwarding
var nRet = RtcEngine.StartOrUpdateChannelMediaRelay(config);
this.Log.UpdateLog(`StartOrUpdateChannelMediaRelay nRet: ${nRet}, New Channel: ${this._appIdInput.channelName}_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.
The updated configuration completely replaces the previous configuration.
- Pause or resume media stream relay
To pause forwarding the media stream to all target channels, call PauseAllChannelMediaRelay.
private void onPauseAllButtonClick()
{
var nRet = RtcEngine.PauseAllChannelMediaRelay();
this.Log.UpdateLog(`onPauseAllButtonClick nRet: ${nRet}`);
}To resume forwarding the media stream to all target channels, call ResumeAllChannelMediaRelay:
private void OnResumeAllButtonClick()
{
var nRet = RtcEngine.ResumeAllChannelMediaRelay();
this.Log.UpdateLog(`OnResumeAllButtonClick nRet: ${nRet}`);
}- Stop cross-channel media stream relay
To stop forwarding the media stream, call StopChannelMediaRelay. When forwarding stops, the host exits all target channels.
private void OnStopButtonClick()
{
var nRet = RtcEngine.StopChannelMediaRelay();
this.Log.UpdateLog(`OnStopButtonClick nRet: ${nRet}`);
}If this method fails, call LeaveChannel to leave the channel and stop cross-channel media stream relay.
- Monitor cross-channel media stream status
During cross-channel media stream relay, the SDK reports changes in the status of media stream relay through the OnChannelMediaRelayStateChanged callback. Implement the relevant business logic based on the status codes.
public override void OnChannelMediaRelayStateChanged(int state, int code)
{
_channelMediaRelay.Log.UpdateLog(`OnChannelMediaRelayStateChanged state: ${state}, code: ${code}`);
}Development considerations
- In a live broadcast use-case, only hosts can call
StartOrUpdateChannelMediaRelay. StartOrUpdateChannelMediaRelaymust be called after successfully joining the channel, otherwise an error is reported.- Multiple hosts can forward media streams in a channel. Each host can forward media streams to up to 6 target channels.
- This function does not support
Stringuids. Additionally, to use the cross-channel microphone function, use theInttype in the normal microphone functionuid.
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
To understand and respond to changes in the media relay state, refer to the CHANNEL_MEDIA_RELAY_STATE and CHANNEL_MEDIA_RELAY_ERROR enums in the API reference.
Sample project
Agora provides an open-source ChannelMediaRelay sample project for your reference. Download the project or view the source code for a more detailed example.
