public void joinRoom(String roomId, String userId, String token) {
Log.d(TAG, String.format("joinRoom: %s %s %s", roomId, userId, token));
mRTCVideo = RTCVideo.createRTCVideo(Utilities.getApplicationContext(), appId, mRTCVideoEventHandler, null, null);
mRTCRoom = mRTCVideo.createRTCRoom(roomId);
mRTCRoom.setRTCRoomEventHandler(mRTCRoomEventHandler);
mRTCRoomEventHandler.setBaseClient(mRTSClient);
UserInfo userInfo = new UserInfo(userId, null);
RTCRoomConfig roomConfig = new RTCRoomConfig(ChannelProfile.CHANNEL_PROFILE_COMMUNICATION,
mRTCRoom.joinRoom(token, userInfo, roomConfig);
VideoCaptureConfig captureConfig = new VideoCaptureConfig(720, 1280, 15);
mRTCVideo.setVideoCaptureConfig(captureConfig);
VideoEncoderConfig config = new VideoEncoderConfig();
mRTCVideo.setVideoEncoderConfig(config);
mRTCVideo.startVideoCapture();
mRTCVideo.startAudioCapture();
private final IRTCRoomEventHandler mRTCRoomEventHandler = new IRTCRoomEventHandler() {
public void onRoomStateChanged(String roomId, String uid, int state, String extraInfo) {
super.onRoomStateChanged(roomId, uid, state, extraInfo);
Log.d(TAG, String.format("onRoomStateChanged: %s, %s, %d, %s", roomId, uid, state, extraInfo));
if (isFirstJoinRoomSuccess(state, extraInfo)) {
if (mSingleLiveInfo != null) {
startLiveTranscoding(roomId, uid, mSingleLiveInfo.pushUrl);
protected boolean isFirstJoinRoomSuccess(int state, String extraInfo) {
JSONObject json = new JSONObject(extraInfo);
joinType = json.getInt("join_type");
return joinType == 0 && state == 0;
private void startLiveTranscoding(String roomId, String userId, String liveUrl,String taskId) {
MixedStreamConfig config = MixedStreamConfig.defaultMixedStreamConfig();
config.setRoomID(roomId);
config.setUserID(userId);
config.setPushURL(liveUrl);
config.setExpectedMixingType(ByteRTCStreamMixingType.STREAM_MIXING_BY_SERVER);
MixedStreamVideoConfig videoConfig = config.getVideoConfig();
videoConfig.setWidth(mHostConfig.width);
videoConfig.setHeight(mHostConfig.height);
videoConfig.setFps(mHostConfig.frameRate);
videoConfig.setBitrate(mHostConfig.bitRate);
config.setVideoConfig(videoConfig);
MixedStreamAudioConfig audioConfig = config.getAudioConfig();
audioConfig.setSampleRate(44100);
audioConfig.setChannels(2);
config.setAudioConfig(audioConfig);
MixedStreamLayoutRegionConfig localRegionConfig = new MixedStreamLayoutRegionConfig();
localRegionConfig.setUserID(userId);
localRegionConfig.setIsLocalUser(true);
localRegionConfig.setRoomID(roomId);
localRegionConfig.setLocationX(0);
localRegionConfig.setLocationY(0);
localRegionConfig.setWidth(mHostConfig.width);
localRegionConfig.setHeight(mHostConfig.height);
localRegionConfig.setAlpha(1);
localRegionConfig.setZOrder(0);
localRegionConfig.setRenderMode(MixedStreamRenderMode.MIXED_STREAM_RENDER_MODE_HIDDEN);
MixedStreamLayoutRegionConfig[] regions = new MixedStreamLayoutRegionConfig[]{localRegionConfig};
MixedStreamLayoutConfig layoutConfig = new MixedStreamLayoutConfig();
layoutConfig.setRegions(regions);
JsonObject json = new JsonObject();
json.addProperty(KEY_SEI_KEY_SOURCE, KEY_SEI_VALUE_SOURCE_NONE);
layoutConfig.setUserConfigExtraInfo(json.toString());
config.setLayout(layoutConfig);
mRTCVideo.startPushMixedStreamToCDN(taskId, config, mMixedStreamObserver);