多方视频通话
功能简介: 多方视频通话时,根据当前业务场景合理设置视频编码参数,可以在较低的带宽占用下实现流畅清晰的音视频沟通,下面将针对几种常见场景进行介绍。
1.一对一
描述:比如双人视频聊天场景,双方通常都希望看到对方比较清晰的视频,此时可以使用较高的视频编码分辨率,比如720P或480P。
- 布局文件:
<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>
- 接口调用:
// 设置自己视频分辨率为720P
VideoCfg cfg = CloudroomVideoMeeting.getInstance().getVideoCfg();
cfg.size = new Size(1280, 720);
CloudroomVideoMeeting.getInstance().setVideoCfg(cfg);
//设置观看自己视频
VideoUIView selfView = (VideoUIView) findViewById(R.id.video_self);
selfView.setUsrVideoId(new UsrVideoId(myUID, (short)-1);
//设置观看对方视频
VideoUIView peerView = (VideoUIView) findViewById(R.id.video_peer);
peerView.setUsrVideoId(new UsrVideoId(peerUid, (short)-1);
相关API请参考:
相关结构定义请参考:
2.多方视频
多方视频示例图:
描述: 比如在线教育场景,老师的视频画面比较大,可以使用较高的分辨率比如720P,下面学生的视频画面比较小,应采用较低的视频编码分辨率,比如360P或256P。
- 布局文件:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical|center_horizontal"
android:orientation="vertical" >
<com.example.main.VideoView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="160dp"
android:layout_weight="0"
android:orientation="horizontal" >
<com.example.main.VideoView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1" />
<com.example.main.VideoView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1" />
<com.example.main.VideoView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1" />
<com.example.main.VideoView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1" />
</LinearLayout>
</LinearLayout>
- 接口调用:
- 老师端设置摄像头使用720P
VideoCfg cfg = CloudroomVideoMeeting.getInstance().getVideoCfg();
// 默认的视频分辨率为720P
cfg.size = new Size(1280, 720);;
CloudroomVideoMeeting.getInstance().setVideoCfg(cfg);
- 学生端设置摄像头使用360P
VideoCfg cfg = CloudroomVideoMeeting.getInstance().getVideoCfg();
// 默认的视频分辨率为360P
cfg.size = new Size(640, 360);;
CloudroomVideoMeeting.getInstance().setVideoCfg(cfg);
- 控件查看视频时,设置相关视频档位:
VideoUIView teacherVideoView = (VideoUIView)findViewById(R.id.video_teacher);
VideoUIView studentVideoView1 = (VideoUIView)findViewById(R.id.video_student1);
VideoUIView studentVideoView2 = (VideoUIView)findViewById(R.id.video_student2);
VideoUIView studentVideoView3 = (VideoUIView)findViewById(R.id.video_student3);
VideoUIView studentVideoView4 = (VideoUIView)findViewById(R.id.video_student4);
// 进入房间后...
// 设置老师端观看视频
teacherVideoView.setUsrVideoId(teacherVideoId);
// 设置学生端观看视频
studentVideoView1.setUsrVideoId(studentVideoId1);
studentVideoView2.setUsrVideoId(studentVideoId2);
studentVideoView3.setUsrVideoId(studentVideoId3);
studentVideoView4.setUsrVideoId(studentVideoId4);
相关API请参考:
相关结构定义请参考:
3.个性化视图:
图一:
图二:
描述:在某些业务场景下,同一个房间内的用户视图不一致,导致同一个视频在不同的用户那里呈现的画面尺寸不一样,比如9方通话场景下原先9个视频画面平铺(如图一),大家都只需要编码256P的视频。某一个时刻用户D开始全屏观看A的视频(如图二),此时A需要编码高分辨率视频比如720P来确保D能看到A的清晰画面,这样一来房间中其他人虽然观看的是A的小画面,却也收到了A的720P视频流,浪费了带宽和解码性能,万一其他用户也做了类似D的操作,整个房间的通话将不可用。 对于这种场景,我们可以启用视频大小流机制,看A小画面的用户订阅A的小流,看A大画面的用户订阅A的大流,这样既能满足各自的清晰度要求,又不会浪费带宽和CPU性能。
- 示例代码:
/* 设置视频流 用户A的代码:
(1)A启用大小流机制 。设置默认视频设置为大流,第二档设置为小流
*/
//配置默认大流使用720p
VideoCfg cfg = CloudroomVideoMeeting.getInstance().getVideoCfg();
cfg.size = new Size(1280, 720);;
CloudroomVideoMeeting.getInstance().setVideoCfg(cfg);
//配置默认小流使用360p
VideoAttributes specialVideoAttr = CloudroomVideoMeeting.getInstance().getLocVideoAttributes(videoID);
cfg.size = new Size(640, 360);;
specialVideoAttr.quality2Cfg = cfg;
CloudroomVideoMeeting.getInstance().setLocVideoAttributes(videoID, specialVideoAttr);
- 观看视频阶段
VideoUIView videoUIView = (VideoUIView)findViewById(R.id.yuv_video);
// 进入房间后...
// 当用户用小流查看视频
int qualityLv = 2;
videoUIView.setUsrVideoId(VideoId, qualityLv);
// 当用户进行观看大流视频的交互操作后...
// 用大流查看视频
qualityLv = 1;
videoUIView.setUsrVideoId(VideoId, qualityLv);
相关API请参考:
相关结构定义请参考: