集成屏幕共享-Windows

简介

屏幕共享是会议成员共享终端的屏幕内容(包括单个程序显示的内容和整个桌面),其他成员可以以视频的方式观看共享的屏幕内容。Windows终端支持发起和接收屏幕共享。在集成屏幕共享功能之前请确认已经完成初始化SDK,登录和会议的相关操作。

屏幕共享的发起

屏幕共享发起分两种情况:

  1. 单人共享。
  2. 多人共享。

单人共享

会议中还没有成员发起屏幕共享,此时某个成员(以下称为发起方)发起屏幕共享,其他成员(以下称为接收方)收到屏幕共享的事件。

发起方的实现:
  1. 获取所有可以共享的窗口列表
    1. 默认第一个窗口是整个Windows桌面,后面的是其他在前台运行的程序窗口。
    2. 每个窗口包含两个string字符串, string[0]是窗口的ID,string[1]是窗口的标题。
  2. 设置屏幕共享的窗口

发起方代码实现如下

  1. public void startDesktopScreenShare()
    {   //获取所有可共享窗口
        List<string[]> windowCaptureList = JCConference.getInstance().getWindowCaptureList();
        //获取桌面共享窗口
        string[] desktopWindow = windowCaptureList[0];
        //获取桌面共享窗口ID
        string desktopId = destopWindow[0];
        //设置屏幕共享窗口
        JCConference.getInstance().setCurrentWindowCaptureId(destopId);
    }
    
接收方的实现:
  1. 某成员屏幕共享发起后,接收方UI会收到EVENT_CONF_SCREEN_SHARE事件回调回调,回调事件的结果是REASON_SCREEN_SHARE_START。
  2. 请求屏幕共享视频。

  3. 渲染屏幕共享视频。

接收方实现代码如下:

public void JCEventPosted(int eventName, int eventCode)
        {
            switch (eventName)
            {
                ...
                case EVENT_CONF_SCREEN_SHARE:
                    //成员屏幕共享开始
                    if(eventCode == REASON_SCREEN_SHARE_START)
                    {
                        //获取会议信息
                        JCConferenceInfo confInfo = JCConference.getInstance().getConferenceInfo();
                        //获取共享屏幕成员ID
                        string screenUserId = confInfo.ScreenUser;
                        //请求共享屏幕视频
                        JCConference.getInstance().requestScreenVideo(PICTURE_SIZE_LARGE);
                        //渲染共享屏幕视频
                        JCConference.getInstance().startScreenRender(mZmfView,JCConference.RENDER_MODE_FULLCONTENT);
                    }
                    break;
            }
        }

多人共享

如果在发起屏幕共享时,有其他成员也发起了屏幕共享。其他成员收到屏幕共享发起成员变化的事件。

发起方实现:

请参考单人共享发起方实现。

接收方实现:
  1. 接收方UI会收到EVENT_CONF_SCREEN_SHARE事件回调回调,回调事件的结果是REASON_SCREEN_SHARE_CHANGE。
  2. 请求屏幕共享视频。
  3. 渲染屏幕共享视频。

接收方实现代码如下:

public void JCEventPosted(int eventName, int eventCode)
        {
            switch (eventName)
            {
                ...
                case EVENT_CONF_SCREEN_SHARE:
                    ...
                    //屏幕共享成员变化
                    else if(eventCode == REASON_SCREEN_SHARE_CHANGE)
                    {
                        //获取会议信息
                        JCConferenceInfo confInfo = JCConference.getInstance().getConferenceInfo();
                        //获取新的共享屏幕成员ID
                        string screenUserId = confInfo.ScreenUser;
                        //请求共享屏幕视频
                        JCConference.getInstance().requestScreenVideo(PICTURE_SIZE_LARGE);
                        //渲染共享屏幕视频
                        JCConference.getInstance().startScreenRender(mZmfView,JCConference.RENDER_MODE_FULLCONTENT);
                    }
                    break;
            }
        }

屏幕共享的取消

发起方实现:
  1. 把屏幕共享窗口设置成空。

发起方实现代码如下:

public void stopSharingScreen()
{
    JCConference.getInstance().setCurrentWindowCaptureId(null);
}
接收方实现:
  1. 屏幕共享取消后,接收方UI会收到EVENT_CONF_SCREEN_SHARE事件回调回调,回调事件的结果是 REASON_SCREEN_SHARE_STOP。

  2. 停止请求屏幕共享视频。

  3. 停止渲染屏幕共享视频。

接收方具体代码如下:

   public void JCEventPosted(int eventName, int eventCode)
           {
               switch (eventName)
               {
                   ...
                   case EVENT_CONF_SCREEN_SHARE:
                       ...

                       else if(eventCode == REASON_SCREEN_SHARE_STOP)
                       {
                           //停止请求共享屏幕视频
                           JCConference.getInstance().requestScreenVideo(PICTURE_SIZE_OFF);
                           //停止渲染共享屏幕视频
                           JCConference.getInstance().stopRender(mZmfView);
                       }
                       break;
               }
           }