集成屏幕共享-Windows
简介
屏幕共享是通信成员共享终端的屏幕内容(包括单个程序显示的内容和整个桌面),其他成员可以以视频的方式观看共享的屏幕内容。Windows终端支持发起和接收屏幕共享。在集成屏幕共享功能之前请确认已经完成初始化SDK,登录和集成通信的相关操作。
屏幕共享的发起
屏幕共享发起分两种情况:
- 单人共享。
- 共享替换。
单人共享
通信会场中还没有成员发起屏幕共享,此时某个成员(以下称为发起方)发起屏幕共享,其他成员(以下称为接收方)收到屏幕共享的事件。
发起方的实现:
- 获取所有可以共享的窗口列表
- 默认第一个窗口是整个Windows桌面,后面的是其他在前台运行的程序窗口。
- 每个窗口包含两个string字符串, string[0]是窗口的ID,string[1]是窗口的标题。
- 设置屏幕共享的窗口
发起方代码实现如下(engine()是JCEngine的实例,具体请参考导入SDK)
public void startDesktopScreenShare()
{ //获取所有可共享窗口
List<string[]> windowCaptureList = engine().getWindowCaptureList();
//获取桌面共享窗口
string[] desktopWindow = windowCaptureList[0];
//获取桌面共享窗口ID
string desktopId = destopWindow[0];
//设置屏幕共享窗口
engine().setCurrentWindowCaptureId(destopId);
}
接收方的实现:
- 某成员屏幕共享发起后,接收方UI会收到 onScreenShareStateChanged(true)的回调
请求屏幕共享视频。
渲染屏幕共享视频。
接收方实现代码如下:
public override void onScreenShareStateChanged(bool active)
{
if(active)
{
//创建视频源
ZmfImageSource mZmfView = new ZmfImageSource(0, 0);
//获取通信房间信息
JCRoomInfo roomInfo = engine().getRoomInfo();
//获取共享屏幕成员ID
string screenUserId = roomInfo.ScreenUser;
//请求共享屏幕视频
engine().requestScreenVideo(PICTURE_SIZE_LARGE);
//渲染共享屏幕视频
engine().startScreenRender(mZmfView,JCEngine.RENDER_MODE_FULLCONTENT);
}
}
共享替换
如果在发起屏幕共享时,有其他成员也发起了屏幕共享。其他成员会先收到之前成员的屏幕共享停止事件,然后再收到新成员发起屏幕共享的事件。
发起方实现:
请参考单人共享发起方实现。
接收方实现:
- 接收方UI会先收到onScreenShareStateChanged(false)的回调,然后再收到onScreenShareStateChanged(true)。
- 请求屏幕共享视频。
- 渲染屏幕共享视频。
接收方实现代码如下:
public override void onScreenShareStateChanged(bool active)
{
if(active)
{
//创建视频源
ZmfImageSource mZmfView = new ZmfImageSource(0, 0);
//获取通信房间信息
JCRoomInfo roomInfo = engine().getRoomInfo();
//获取共享屏幕成员ID
string screenUserId = roomInfo.ScreenUser;
//请求共享屏幕视频
engine().requestScreenVideo(PICTURE_SIZE_LARGE);
//渲染共享屏幕视频
engine().startScreenRender(mZmfView,JCEngine.RENDER_MODE_FULLCONTENT);
}
else
{
if(mZmfView != null)
{
//停止请求共享屏幕视频
engine().requestScreenVideo(PICTURE_SIZE_OFF);
//停止渲染共享屏幕视频
engine().stopRender(mZmfView);
}
}
}
屏幕共享的取消
发起方实现:
- 把屏幕共享窗口设置成空。
发起方实现代码如下:
public void stopSharingScreen()
{
engine().setCurrentWindowCaptureId(null);
}
接收方实现:
屏幕共享取消后,接收方会收到onScreenShareStateChanged(false)的回调
停止请求屏幕共享视频。
停止渲染屏幕共享视频。
接收方具体代码如下:
public override void onScreenShareStateChanged(bool active)
{
...
else if(!active)
{
if(mZmfView != null)
{
//停止请求共享屏幕视频
engine().requestScreenVideo(PICTURE_SIZE_OFF);
//停止渲染共享屏幕视频
engine().stopRender(mZmfView);
}
}
...
}