ZEGO no longer classifies environments into production environments and testing environments.
If you create your project in ZEGOCLOUD Admin Console on/before 2021-11-16, refer to the Testing environment deprecation to upgrade the SDK and adjust related codes.
This guide describes how to implement basic audio and video functions with the ZEGO Express SDK.
Basic concepts:
ZEGO Express SDK: The real-time audio and video SDK developed by ZEGO to help you quickly build high-quality, low-latency, and smooth real-time audio and video communications into your apps across different platforms, with support for massive concurrency.
Stream publishing: The process of the client app capturing and transmitting audio and video streams to the ZEGO Real-Time Audio and Video Cloud.
Stream playing: The process of the client app receiving and playing audio and video streams from the ZEGO Real-Time Audio and Video Cloud.
Room: The service for organizing groups of users, allowing users in the same room to send and receive real-time audio, video, and messages to each other.
For more basic concepts, refer to the Glossary.
Before you begin, make sure you complete the following steps:
If the version of the ZEGO Express SDK you are using is under 2.17.0, to get the AppSign, contact the ZEGOCLOUD Technical Support. To upgrade the authentication mode from using the AppSign to Token, see Upgrade guide.
The following diagram shows the basic process of User A playing a stream published by User B:
The following sections explain each step of this process in more detail.
Before creating a ZegoExpressEngine
instance, we recommend you add the following UI elements to implement basic real-time audio and video features:
To create a singleton instance of the ZegoExpressEngine
class, call the createEngine
method with the AppID of your project.
To receive callbacks, implement an event handler object that conforms to the IZegoEventHandler
protocol, and then pass the implemented event handler object to the createEngine
method as the eventHandler
parameter.
Alternatively, you can pass null
to the createEngine
method as the eventHandler
parameter for now, and then call the method setEventHandler
to set up the event handler after creating the engine.
/** Define a ZegoExpressEngine object */
ZegoExpressEngine engine;
ZegoEngineProfile profile = new ZegoEngineProfile();
/** AppID format: 123456789L */
profile.appID = appID;
/** General scenario */
profile.scenario = ZegoScenario.GENERAL;
/** Set application object of App */
profile.application = getApplication();
/** Create a ZegoExpressEngine instance */
engine = ZegoExpressEngine.createEngine(profile, null);
Before logging in to a room, you will need to generate a token first; Otherwise, the login will fail.
To generate a token, refer to the Use Tokens for authentication.
To log in to a room, call the loginRoom
method.
/** create a user */
ZegoUser user = new ZegoUser("user1");
ZegoRoomConfig roomConfig = new ZegoRoomConfig();
/** Token is generated by the user's own server. For an easier and convenient debugging, you can get a temporary token from the ZEGOCLOUD Admin Console */
roomConfig.token = "xxxx";
/** onRoomUserUpdate callback can be received only by passing in a ZegoRoomConfig whose "isUserStatusNotify" parameter value is "true".*/
roomConfig.isUserStatusNotify = true;
/** log in to a room */
engine.loginRoom("room1", user, roomConfig, (int error, JSONObject extendedData)->{
// (Optional callback) The result of logging in to the room. If you only pay attention to the login result, you can use this callback.
});
Then, to listen for and handle various events that may happen after logging in to a room, you can implement the corresponding event callback methods of the event handler as needed. The following are some common event callbacks related to room users and streams:
onRoomStateUpdate
: Callback for updates on current user's room connection status. When the current user's room connection status changes (for example, when the current user is disconnected from the room or login authentication fails), the SDK sends out the event notification through this callback.
onRoomUserUpdate
: Callback for updates on the status of other users in the room. When other users join or leave the room, the SDK sends out the event notification through this callback.
onRoomStreamUpdate
: Callback for updates on the status of the streams in the room. When new streams are published to the room or existing streams in the room stop, the SDK sends out the event notification through this callback.onRoomUserUpdate
callback, you must set the isUserStatusNotify
property of the room configuration parameter ZegoRoomConfig
to true
when you call the loginRoom
method to log in to a room.onRoomStreamUpdate
callback, and when there is a stream added, call the startPlayingStream
method to start receiving and playing the newly added stream.engine.setEventHandler(new IZegoEventHandler() {
/** Common event callbacks related to room users and streams. */
/** Callback for updates on the current user's room connection status. */
@Override
public void onRoomStateUpdate(String roomID, ZegoRoomState state, int errorCode, JSONObject extendedData) {
/** Implement the callback handling logic as needed. */
}
/** Callback for updates on the status of other users in the room. */
@Override
public void onRoomUserUpdate(String roomID, ZegoUpdateType updateType, ArrayList<ZegoUser> userList) {
/** Implement the callback handling logic as needed. */
}
/** Callback for updates on the status of the streams in the room. */
@Override
public void onRoomStreamUpdate(String roomID, ZegoUpdateType updateType, ArrayList<ZegoStream> streamList, JSONObject extendedData){
/** Implement the callback handling logic as needed. */
}
});
To start the local video preview, call the startPreview
method with the view for rendering the local video passed to the canvas
parameter.
You can use a SurfaceView
, TextureView
, or SurfaceTexture
to render the video.
/**
* Set up a view for the local video preview and start the preview with SDK's default view mode (AspectFill).
* The following play_view is a SurfaceView, TextureView, or SurfaceTexture object on the UI.
*/
engine.startPreview(new ZegoCanvas(preview_view));
To start publishing a local audio or video stream to remote users, call the startPublishingStream
method with the corresponding Stream ID passed to the streamID
parameter.
streamID
must be globally unique within the scope of the AppID. If different streams are published with the same streamID
, the ones that are published after the first one will fail.
/** Start publishing a stream */
engine.startPublishingStream("stream1");
Then, to listen for and handle various events that may happen after stream publishing starts, you can implement the corresponding event callback methods of the event handler as needed. The following is a common event callback related to stream publishing:
onPublisherStateUpdate
: Callback for updates on stream publishing status. After stream publishing starts, if the status changes, (for example, when the stream publishing is interrupted due to network issues and the SDK retries to start publishing the stream again), the SDK sends out the event notification through this callback.engine.setEventHandler(new IZegoEventHandler() {
/** Common event callbacks related to stream publishing. */
/** Callback for updates on stream publishing status. */
@Override
public void onPublisherStateUpdate(String streamID, ZegoPublisherState state, int errorCode, JSONObject extendedData){
/** Implement the callback handling logic as needed. */
}
});
To start playing a remote audio or video stream, call the startPlayingStream
method with the corresponding Stream ID passed to the streamID
parameter and the view for rendering the video passed to the canvas
parameter.
You can obtain the stream IDs of the streams published by other users in the room from the callback onRoomStreamUpdate
.
You can use a SurfaceView
, TextureView
, or SurfaceTexture
to render the video.
/**
* Start playing a remote stream with the SDK's default view mode (AspectFill).
* The play_view below is a SurfaceView/TextureView/SurfaceTexture object on UI.
*/
engine.startPlayingStream("stream1", new ZegoCanvas(play_view));
Then, to listen for and handle various events that may happen after stream playing starts, you can implement the corresponding event callback methods of the event handler as needed. The following is a common event callback related to stream playing:
onPlayerStateUpdate
: Callback for updates on stream playing status. After stream playing starts, if the status changes (for example, when the stream playing is interrupted due to network issues and the SDK retries to start playing the stream again), the SDK sends out the event notification through this callback.engine.setEventHandler(new IZegoEventHandler() {
/** Common event callbacks related to stream playing. */
/** Callback for updates on stream playing status. */
@Override
public void onPlayerStateUpdate(String streamID, ZegoPlayerState state, int errorCode, JSONObject extendedData){
/** Implement the callback handling logic as needed. */
}
});
We recommend you run your project on a real device. If your app runs successfully, you should hear the sound and see the video captured locally from your device.
To test out the real-time audio and video features, visit the ZEGO Express Web Demo, and enter the same AppID
, Server
and RoomID
to join the same room. If it runs successfully, you should be able to view the video from both the local side and the remote side, and hear the sound from both sides as well.
In audio-only scenarios, no video will be captured and displayed.
To stop publishing a local audio or video stream to remote users, call the stopPublishingStream
method.
/** Stop publishing a stream */
engine.stopPublishingStream();
If local video preview is started, call the stopPreview
method to stop it as needed.
/** Stop local video preview */
engine.stopPreview();
To stop playing a remote audio or video stream, call the stopPlayingStream
method with the corresponding stream ID passed to the streamID
parameter.
/** Stop playing a stream*/
engine.stopPlayingStream(streamID);
To log out of a room, call the logoutRoom
method with the corresponding room ID passed to the roomID
parameter.
/** Log out of a room */
engine.logoutRoom("room1");
ZegoExpressEngine
instanceTo destroy the ZegoExpressEngine
instance and release the resources it occupies, call the destroyEngine
method.
callback
when destroying the ZegoExpressEngine
instance.
This callback can only be used to send out a notification when the destruction of the engine is completed. You can't use this callback method to release engine-related resources.null
to destroyEngine
instead./** Destroy the ZegoExpressEngine instance */
ZegoExpressEngine.destroyEngine(null);
The following diagram shows the API call sequence of the stream publishing and playing process: