Co-hosting across channels refers to the process where the Agora SDK relays the media stream of a host from an interactive live streaming channel (source channel) to a maximum of four interactive live streaming channels (destination channels). It has the following benefits:
Co-hosting across channels applies to scenarios such as an online singing contest, where hosts of different channels interact with each other.
Agora provides an open-source HostAcrossChannel sample project on GitHub. You can download the project to try it out or view the source code.
Before relaying media streams across channels, ensure that you have implemented the basic real-time communication functions in your project.
As of v2.9.0, the Agora Native SDK supports co-hosting across channels with the following methods:
startChannelMediaRelay
updateChannelMediaRelay
stopChannelMediaRelay
Once the channel media relay starts, the SDK relays the media streams of a host from the source channel to at most four destination channels.
During the relay, the SDK reports the states and events of the channel media relay with the onChannelMediaRelayStateChanged
and onChannelMediaRelayEvent
callbacks. Refer to the following codes and their corresponding states to implement your code logic:
State codes | Event codes | The media stream relay state |
---|---|---|
RELAY_STATE_RUNNING(2) and RELAY_OK(0) | RELAY_EVENT_PACKET_SENT_TO_DEST_CHANNEL(4) | The channel media relay starts. |
RELAY_STATE_FAILURE(3) | / | Exceptions occur for the media stream relay. Refer to the error parameter for troubleshooting. |
RELAY_STATE_IDLE(0) and RELAY_OK(0) | / | The channel media relay stops. |
startChannelMediaRelay
method to enable channel media stream relay. The SDK relays the media streams of the host who calls the method.onUserOffline
callback.Follow the API call sequence to implement your code logic:
// Initializes RtcEngine.
engine = RtcEngine.create(context.getApplicationContext(), yourAppId, iRtcRngineEventHandler);
...
// Guides the user to set the destination channel name, and assigns the name to destChannelName.
String destChannelName = et_channel_ex.getText().toString();
if(destChannelName.length() == 0){
showAlert("Destination channel name is empty!");
}
// Configures the source channel information. For channelName, use the source channel name set by the user. For myUid, set it as 0.
// Note that sourceChannelToken is different from the token used for joining the source channel. You need to generate sourceChannelToken with the source channel name and a uid of 0.
ChannelMediaInfo srcChannelInfo = new ChannelMediaInfo(et_channel.getText().toString(), sourceChannelToken, myUid);
ChannelMediaRelayConfiguration mediaRelayConfiguration = new ChannelMediaRelayConfiguration();
mediaRelayConfiguration.setSrcChannelInfo(srcChannelInfo);
// Configures the destination channel information. Set destChannelName as the channel name set by the user. myUid is the user ID that the user uses in the destination channerl.
ChannelMediaInfo destChannelInfo = new ChannelMediaInfo(destChannelName, destChannelToken, myUid);
mediaRelayConfiguration.setDestChannelInfo(destChannelName, destChannelInfo);
// Calls startChannelMediaRelay to start relaying media streams across channels.
engine.startChannelMediaRelay(mediaRelayConfiguration);
// Calls stopChannelMediaRelay to stop relaying media streams across channels.
engine.stopChannelMediaRelay();
// Uses the onChannelMediaRelayStateChanged callback to monitor the state of the channel media relay.
public void onChannelMediaRelayStateChanged(int state, int code) {
switch (state){
case RELAY_STATE_CONNECTING:
mediaRelaying = true;
handler.post(() ->{
showLongToast("channel media relay connected.");
});
break;
case RELAY_STATE_FAILURE:
mediaRelaying = false;
handler.post(() ->{
showLongToast(String.format("channel media relay failed at error code: %d", code));
});
}
}
startChannelMediaRelay
updateChannelMediaRelay
stopChannelMediaRelay
onChannelMediaRelayStateChanged
onChannelMediaRelayEvent
updateChannelMediaRelay
.When setting the source channel information, ensure that you set uid
as 0, and the uid
that you use to generate the token should also be set as 0.
To call startChannelMediaRelay
again after it succeeds, you must call stopChannelMediaRelay
to quit the current relay.