# Realize group video calling

This guide introduces how to implement group video calling. The API call sequence of group video calling is shown in the figure below:

../../../../_images_en/multivideoworkflow.jpg

# Initialize

Call JCMediaDevice.create (opens new window) and JCCall.create (opens new window) to initialize Modules needed to implement group calling:

// Declare object
JCMediaDevice mMediaDevice;
JCMediaChannel mMediaChannel;

// Initialization function
public boolean initialize(Context context) {

    //1. Media class
    mMediaDevice = JCMediaDevice.create(mClient, new JCMediaDeviceCallback() {
        @Override
        public void onCameraUpdate() {

        }
        @Override
        public void onAudioOutputTypeChange(int i) {

        }
        @Override
        public void onRenderReceived(JCMediaDeviceVideoCanvas jcMediaDeviceVideoCanvas) {

        }
        @Override
        public void onRenderStart(JCMediaDeviceVideoCanvas jcMediaDeviceVideoCanvas) {

        }
    });
    // 2. Media channel lass
    mMediaChannel = JCMediaChannel.create(client, mediaDevice, new JCMediaChannelCallback() {
        @Override
        public void onMediaChannelStateChange(int i, int i1) {

        }
        @Override
        public void onMediaChannelPropertyChange(JCMediaChannel.PropChangeParam propChangeParam) {

        }
        @Override
        public void onJoin(boolean b, int i, String s) {

        }
        @Override
        public void onLeave(int i, String s) {

        }
        @Override
        public void onStop(boolean b, int i) {

        }
        @Override
        public void onQuery(int i, boolean b, int i1, JCMediaChannelQueryInfo jcMediaChannelQueryInfo) {

        }
        @Override
        public void onParticipantJoin(JCMediaChannelParticipant jcMediaChannelParticipant) {

        }
        @Override
        public void onParticipantLeft(JCMediaChannelParticipant jcMediaChannelParticipant) {

        }
        @Override
        public void onParticipantUpdate(JCMediaChannelParticipant jcMediaChannelParticipant, JCMediaChannelParticipant.ChangeParam changeParam) {

        }
        @Override
        public void onMessageReceive(String s, String s1, String s2) {

        }
        @Override
        public void onInviteSipUserResult(int i, boolean b, int i1) {

        }
        @Override
        public void onParticipantVolumeChange(JCMediaChannelParticipant jcMediaChannelParticipant) {

        }
    });
}

# Join a channel

  1. Call enableUploadAudioStream (opens new window) to enable the audio stream:

    // 1. Enable the audio stream
    mMediaDeviceChannel.enableUploadAudioStream(true);
    // 2. Turn on the video stream (not for voice)
    mMediaDeviceChannel.enableUploadVIdeoStream(true);
    
  2. To create and join a channel, you need to pass in channelIdOrUri and JCMediaChannel.JoinParam (opens new window):

    • channelIdOrUri refers to the channel ID or channel Uri.

    • In JCMediaChannelJoinParam, the uriMode parameter is set to true, which means the incoming channel Uri. When other parameters are set, it means the incoming channel ID. Users who pass in the same channel ID or the same channel Uri will enter the same Channel.

    mMediaChannel.join("222", null);
    
  3. The onJoin (opens new window) callback triggers after joining the channel:

    @Override
    public void onJoin(boolean result, @JCMediaChannel MediaChannelReason int reason, String channelId) {
        if (result) {
            // Join the channel successfully
        } else {
            // Join the channel failed
        }
    }
    

# Create local video images

After joining the channel, call getSelfParticipant (opens new window) in JCMediaChannel (opens new window) to get the self object in the channel, then call the startVideo (opens new window) method in JCMediaChannelParticipant (opens new window) to open the local video preview. The returned object is JCMediaDeviceVideoCanvas (opens new window) . (Calling this method will turn on the camera):

// Open local video preview
mMediaChannel.getSelfParticipant().startVideo(JCMediaDevice.RENDER_FULL_CONTENT, JCMediaChannel.PICTURESIZE_LARGE);

# Create remote video images

You usually need to see other users during a video call. After joining the channel, call getParticipants (opens new window) in JCMediaChannel (opens new window) to get all the member objects in the channel.

Call startVideo (opens new window) in the JCMediaChannelParticipant (opens new window) class to get the remote video image. The returned object is JCMediaDeviceVideoCanvas (opens new window).

After calling the startVideo (opens new window) method, you also need to call the requestVideo (opens new window) method in JCMediaChannel (opens new window) to request the video streams of other users in the channel:

// Access all member objects
List<JCMediaChannelParticipant> participants = mMediaChannel.getParticipants();
// Call the method of creating a video image
participants.get(0).startVideo(JCMediaDevice.RENDER_FULL_CONTENT, JCMediaChannel.PICTURESIZE_LARGE);
// Request remote video stream (call large video window)
mMediaChannel.requestVideo(participants.get(0), PICTURESIZE_LARGE);

# Leave a channel

Call the leave (opens new window) method to leave the current channel:

mMediaChannel.leave();

In a group video call, you need to call stopVideo (opens new window) to remove the video image when leaving the channel:

mParticipant.stopVideo();

After leaving the channel, they receive the onLeave (opens new window) callback, and other members receive the onParticipantLeft (opens new window) callback at the same time.

# Destroy local and remote video images

Call stopVideo (opens new window) in the JCMediaChannelParticipant (opens new window) to destroy local and remote video images:

// The callback of leaving the ChannelReason
@Override
public void onLeave(@JCMediaChannel.MediaChannelReason int reason, String channelId) {
    ...
    // Destroy the video
    mParticipant.stopVideo();
}

# Destroy a channel

If you want to destroy a channel, you can call the following interface, and all members will be quit:

// End a channel
mMediaChannel.stop();

In a group video call, you need to call stopVideo (opens new window) to remove the video image when leaving the channel:

mParticipant.stopVideo();

After the channel is stopped, the member who initiated the termination receives the onStop (opens new window) callback, and other members also receive the onLeave (opens new window) callback. Please refer to MediaChannelReason (opens new window) for the enumeration value of the reason for failure:

@Override
public void onStop(boolean result, @JCMediaChannel.MediaChannelReason int reason) {
    //Destroy the video, canvas is the instance of JCMediaDeviceVideoCanvas object
    mParticipant.stopVideo();
    canvas = null;
}