如下是一个总体接入流程,详细细节请参见 RTC服务开通指南。
/**
* 初始化并加入房间
* @param appId 应用申请的appId
* @param roomId 要加入的RTC房间
* @param userId 用户的UserId
* @param userName 用户的UserName
* @param token 要加入RTC房间对应的Token
*/
public void initAndJoinRoom(String appId, String roomId, String userId, String userName,
String token) {
// 创建RTC引擎对象
mRTCVideo = RTCVideo.createRTCVideo(applicationContext, appId,
mIRTCEngineEventHandler, null, null);
// 创建RTC Room对象
mRTCRoom = mRTCVideo.createRTCRoom(roomId);
mRTCRoom.setRTCRoomEventHandler(mRTCRoomEventHandler);
// 开启音频采集
mRTCVideo.startAudioCapture();
// 根据设置开启/关闭视频采集
if (mIsCameraOn) {
mRTCVideo.startVideoCapture();
} else {
mRTCVideo.stopVideoCapture();
}
// 根据设置开启/关闭音频推送
if (mIsAudioMute) {
mRTCRoom.unpublishStream(MediaStreamType.RTC_MEDIA_STREAM_TYPE_AUDIO);
} else {
mRTCRoom.publishStream(MediaStreamType.RTC_MEDIA_STREAM_TYPE_AUDIO);
}
// 根据设置选择音频路由模式,扬声器/听筒
mRTCVideo.setDefaultAudioRoute(mIsSpeakerphone
? AudioRoute.AUDIO_ROUTE_SPEAKERPHONE
: AudioRoute.AUDIO_ROUTE_EARPIECE);
// 启用音频信息提示,回调周期 1000ms
mRTCVideo.enableAudioPropertiesReport(new AudioPropertiesConfig(1000,true,false));
// 加入RTC房间,开启自动发布和订阅
RTCRoomConfig roomConfig = new RTCRoomConfig(ChannelProfile.CHANNEL_PROFILE_COMMUNICATION,
true, true, true);
mRTCRoom.joinRoom(token, userIdNameToUserInfo(userId, userName), roomConfig);
}
/**
* 组装RTC的userInfo
* 用户昵称使用json格式记录在extraInfo里面,其他用户可以在 onUserJoined 回调中解析出来
*
* @param userId 用户id
* @param userName 用户昵称
* @return userinfo
*/
private UserInfo userIdNameToUserInfo(String userId, String userName) {
VideoCallUserInfo userInfo = new VideoCallUserInfo();
userInfo.userId = userId;
userInfo.userName = userName;
String extra = GsonUtils.gson().toJson(userInfo);
return new UserInfo(userId, extra);
}
/**
* 用户数据模型
*/
public class VideoCallUserInfo {
// 用户昵称
@SerializedName("user_name")
public String userName;
// 用户id
@SerializedName("user_id")
public String userId;
}
public void leaveRoom() {
if (mRTCVideo != null) {
// 停止音频采集
mRTCVideo.stopAudioCapture();
}
if (mRTCRoom != null) {
//离开频道
mRTCRoom.leaveRoom();
mRTCRoom.destroy();
mRTCRoom = null;
}
}
-onUserJoined
回调。/**
* 房间状态改变回调,加入房间、离开房间、发生房间相关的警告或错误时会收到此回调。
* @param roomId 房间id
* @param uid 用户id
* @param state 房间状态码
* @param extraInfo 额外信息
*/
@Override
public void onRoomStateChanged(String roomId, String uid, int state, String extraInfo) {
super.onRoomStateChanged(roomId, uid, state, extraInfo);
int joinType = getJoinType(extraInfo);
if (joinType == 1 && state == 0) {
SolutionDemoEventManager.post(new NetworkTypeChangedEvent(true));
}
}
/**
* 获取加入房间类型
* @param extraInfo 额外信息
* @return 加入房间类型
*/
private int getJoinType(String extraInfo) {
int joinType = -1;
try {
// 341后 SDK传的固定键 joinType表示加入房间的类型,0为首次进房,1为重连进房。
JSONObject json = new JSONObject(extraInfo);
joinType = json.getInt("join_type");
} catch (Exception e) {
e.printStackTrace();
}
return joinType;
}
屏幕共享参看Android 端屏幕共享
功能点 | API |
---|---|
创建 ByteRTCVideo 实例 | createRTCVideo |
设置视频发布参数 | SetVideoEncoderConfig |
开启本地音频采集 | startAudioCapture |
开启本地视频采集 | startVideoCapture |
设置本地视频渲染 | setLocalVideoCanvas |
加入 RTC 房间 | joinRoom |
设置视频渲染视图 | setRemoteVideoCanvas |
离开房间 | leaveRoom |
关闭内部音频采集 | stopAudioCapture |
关闭内部视频采集 | stopVideoCapture |
销毁引擎实例对象 | destroy |
发布本地通过摄像头/麦克风采集的媒体流 | publishStream |
取消发布本地通过摄像头/麦克风采集的媒体流 | unpublishStream |
设置音频播放设备为扬声器或者听筒 | setAudioRoute |
开启音量提示 | enableAudioPropertiesReport |
开启镜像 | setLocalVideoMirrorType |
设置音质档位 | setAudioProfile |
切换视前置/后置摄像头 | switchCamera |
功能点 | 回调 |
---|---|
本地进房成功回调 | onRoomStateChanged |
远端可见用户加入房间 | onUserJoined |