实现音视频通话

  • 快速创建并进入房间,开始音视频通话;以下均为Java代码,详细代码请参考Examples目录下Demo源代码。

  • 请先完成SDK集成准备,并确认测试设备工作正常。


基本步骤如下:

  1. 初始化SDK
  2. 硬件加速视频渲染
  3. 登录连接视频服务器
  4. 创建房间
  5. 进入房间
  6. 打开麦克风/摄像头
  7. 观看他人视频
  8. 退出房间
  9. 注销登录
  10. 反初始化,退出SDK

1. 初始化SDK

初始化是整个SDK的使用基础,通常在程序启动的时候进行初始化(init),退出的时候进行反初始化(uninit),整个程序的生命周期中只进行一次初始化和反初始化。

SDK内部的组件多为单例组件,整个程序中只能有一个实例,比如“基础组件”,“房间管理组件”,“视频房间组件”,具体请参见各个组件说明。

// 初始化SDK

// SDK初始化数据对象
SdkInitDat initDat = new SdkInitDat();

// 初始化SDK
CloudroomVideoSDK.getInstance().init(getApplicationContext(), initDat);

相关API请参考:

相关结构定义请参考:

2. 硬件加速视频渲染

通过设置视频控件相关的窗口进行硬件加速,利用手机硬件GPU来提升界面的渲染效果

AndroidManifest.xml配置文件:

<activity
  android:name=".VideoMeetingActivity"
  android:hardwareAccelerated = "true"
</activity>

注意:配置硬件加速可能导致某些机型上非视频控件显示不正常,需要关闭其他控件的硬件加速:

noUIVideoLayout.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

3. 登录连接视频服务器

设置视频服务器地址,使用云屋授权账号和自定义用户编号登录

  • 调用接口:
// 设置服务器地址
CloudroomVideoSDK.getInstance().setServerAddr(server);

// 登录数据对象
LoginDat loginDat = new LoginDat();
// 昵称
loginDat.nickName = nickName;
// 用户ID
loginDat.privAcnt = privAcnt;
// appID,使用开通SDK的账号
loginDat.authAcnt = account;
// 登录密码必须做MD5处理
loginDat.authPswd = md5Pswd;
// 执行登录操作
CloudroomVideoMgr.getInstance().login(loginDat);
  • 回调通知:
// 登陆失败
@Override
public void loginFail(CRVIDEOSDK_ERR_DEF sdkErr, String cookie) {
	//TODO Auto-generated method stub
}

// 登陆成功
@Override
public void loginSuccess(String usrID, String cookie) {
	//TODO Auto-generated method stub
}

//掉线
@Override
public void lineOff(CRVIDEOSDK_ERR_DEF sdkErr) {
	//TODO Auto-generated method stub
}

相关API请参考:

4. 创建房间

输入房间标题,创建一个没有密码的房间

  • 调用接口:
// 创建房间,不设置密码
CloudroomVideoMgr.getInstance().createMeeting(subject, false, TAG);  
  • 回调通知:
// 创建房间成功
@Override
public void createMeetingSuccess(MeetInfo meetInfo, String cookie) {
	 //TODO Auto-generated method stub
}

// 创建房间失败
public void createMeetingFail(CRVIDEOSDK_ERR_DEF sdkErr, String cookie) {
	//TODO Auto-generated method stub
}

相关API请参考:

5. 进入房间

用创建成功的房间信息(房间ID和密码)进入房间,其他用户也是利用此房间信息进入该房间。

  • 调用接口:
CloudroomVideoMeeting.getInstance().enterMeeting(meetInfo.ID, meetInfo.pswd, UserID, UserID)
  • 回调通知:
@Override
public void enterMeetingRslt(CRVIDEOSDK_ERR_DEF code) {
	// TODO Auto-generated method stub
    if (code == CRVIDEOSDK_NOERR) {
		 //进入房间成功
    } else if (code == CRVIDEOSDK_MEETROOMLOCKED) {
		// 房间已加锁
    } else {
		//进入房间失败
    }
}

相关API请参考:

6. 打开麦克风/摄像头

紧接第4步,进入房间成功后,打开自己的麦克风和摄像头,以便本地、远端显示自己的视频图像

// 默认使用前置摄像头
ArrayList<UsrVideoInfo> myVideos = CloudroomVideoMeeting.getInstance().getAllVideoInfo(myUserID);
	
// 获取终端的所有摄像头,并设置默认的摄像头为前置摄像头	
for (UsrVideoInfo vInfo : myVideos) {
	if (vInfo.videoName.contains("FRONT")) {
		CloudroomVideoMeeting.getInstance().setDefaultVideo(myUserID, vInfo.videoID);
		break;
	}
}

// 打开摄像头
CloudroomVideoMeeting.getInstance().openVideo(myUserID);

// 打开麦克风
CloudroomVideoMeeting.getInstance().openMic(myUserID);

// 开启外放
CloudroomVideoMeeting.getInstance().setSpeakerOut(true);

// 获取摄像头的相关配置, 设置分辨率为128
VideoCfg cfg = CloudroomVideoMeeting.getInstance().getVideoCfg();
cfg.size = new Size(128, 80);
		
// 保存摄像头配置到SDK
CloudroomVideoMeeting.getInstance().setVideoCfg(cfg);

相关API请参考:

相关结构定义请参考:

7. 观看他人视频

成功进入房间后,根据他人登录用户id ,设置并观看他人视频图像

创建成员视频UI显示组件

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:tag="1v1" >

    <com.cloudroom.cloudroomvideosdk.VideoUIView
    	android:id="@+id/video_self"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <com.cloudroom.cloudroomvideosdk.VideoUIView
    	android:id="@+id/video_peer"
        android:layout_width="160dp"
        android:layout_height="90dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true" />

</RelativeLayout>

获取成员视频UI显示组件

VideoUIView mOtherYuv = (VideoUIView)findViewById(R.id.yuv_other);

设置成员视频UI显示组件的相关摄像头Id

// 一对一视频情况下 观看他人的摄像头视频
VideoUIView selfView = (VideoUIView) findViewById(R.id.video_self);
//-1表示观看默认摄像头
selfView.setUsrVideoId(new UsrVideoId(myUserId, (short)-1);

//设置观看对方视频
VideoUIView peerView = (VideoUIView) findViewById(R.id.video_peer);
ArrayList<UsrVideoId> videos = CloudroomVideoMeeting.getInstance().getWatchableVideos();
for (UsrVideoId usrVideoId : videos) {
    if (!usrVideoId.userId.equals(myUserId)) {
	peerView.setUsrVideoId(usrVideoId);
    } 
}

相关API请参考:

相关结构定义请参考:

8. 退出房间


// 离开房间
CloudroomVideoMeeting.getInstance().exitMeeting();

相关API请参考:

9. 注销登录


//注销本次登录
CloudroomVideoMgr.getInstance().logout();

相关API请参考:

10. 反初始化,退出SDK

执行反初始化后SDK功能不再可用。

//反初始化
CloudroomVideoSDK.getInstance().unInit();

相关API请参考: