集成屏幕共享功能 - iOS

简介

屏幕共享是会议内成员共享本终端的屏幕内容,其他成员以视频的方式观看共享的屏幕内容。iOS 端可以显示其他终端共享的屏幕内容,但是暂不支持发起共享。

在集成屏幕共享前,确保已完成了会议的基本功能。

屏幕共享发起

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

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

单人共享

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

发起方的实现

iOS 端暂不支持发起屏幕共享。

接收方的实现

  1. 屏幕共享发起后,UI 会收到 JCConferenceEventScreenShare 屏幕共享的事件回调,并且事件的结果是 JCReasonScreenShareStart

  2. UI 获取发起成员的信息。

  3. UI 显示屏幕共享的视频。

接收方实现代码如下:

- (void)conferenceEvent:(JCConferenceEvent)event eventReason:(JCEventReason)eventReason 
{
    //JCConferenceEventScreenShare是屏幕共享的事件
    if (event == JCConferenceEventScreenShare) {
        //JCReasonScreenShareStart表示有成员发起了共享
        if (eventReason == JCReasonScreenShareStart) {
            JCConferenceManager *confManager = [JCConferenceManager sharedManager];
            //获取会议信息
            JCConferenceModel *confInfo = [confManager getConferenceInfo];
            //获取发起成员的信息
            JCParticipantModel *screenSharer = confInfo.screenSharer;
            //UI 可以显示发起者的昵称
            NSString *displayName = screenSharer.displayName;

            //先请求共享的视频
            [confManager requestScreenVideoWithPictureSize:JCVideoPictureSizeLarge];
            //在把视频渲染到UIView上
            [confManager startScreenRender:renderView 
                                      mode:JCRenderFullContent 
                                 completed:nil];
        } 
    }
}

注:请求屏幕共享视频分辨率的原则和请求成员视频分辨率的原则一致。

多人共享

会议中已经有成员发起了屏幕共享,此时另一个成员也发起屏幕共享,其他成员收到屏幕共享发起成员变化的事件。

发起方的实现

iOS 端暂不支持发起屏幕共享。

接收方的实现

  1. 屏幕共享发起后,UI 会收到 JCConferenceEventScreenShare 屏幕共享的事件回调,并且事件的结果是 JCReasonScreenShareChanged

  2. UI 更新发起成员的信息。

  3. UI 显示屏幕共享的视频。

    注:如果 UI 已经显示了屏幕共享的视频,随屏幕共享发起成员改变后,视频的内容会自动改变。因此上面第3步可以忽略。

接收方实现代码如下:

- (void)conferenceEvent:(JCConferenceEvent)event eventReason:(JCEventReason)eventReason
{
    //JCConferenceEventScreenShare是屏幕共享的事件
    if (event == JCConferenceEventScreenShare) {
        //JCReasonScreenShareChanged表示发起屏幕共享的成员改变了
        if (eventReason == JCReasonScreenShareChanged) {
            JCConferenceManager *confManager = [JCConferenceManager sharedManager];
            //获取会议信息
            JCConferenceModel *confInfo = [confManager getConferenceInfo];
            //获取当前发起成员的信息
            JCParticipantModel *screenSharer = confInfo.screenSharer;
            //UI 更新发起者的昵称
            NSString *displayName = screenSharer.displayName;

        } 
    }
}

屏幕共享取消

屏幕共享取消的过程分为:

  1. 会议中发起屏幕共享的成员(发起方)取消了屏幕共享
  2. 会议中其他成员(接收方)收到屏幕共享取消的事件。

发起方的实现

iOS 端暂不支持取消屏幕共享

接收方的实现

  1. 屏幕共享取消后,UI 会收到 JCConferenceEventScreenShare 屏幕共享的事件回调,并且事件的结果是 JCReasonScreenShareStop

  2. UI 关闭屏幕共享的视频。

接收方实现代码如下:

- (void)conferenceEvent:(JCConferenceEvent)event eventReason:(JCEventReason)eventReason 
{
    //JCConferenceEventScreenShare是屏幕共享的事件
    if (event == JCConferenceEventScreenShare) {
        //JCReasonScreenShareStop表示发起的成员取消了共享
        if (eventReason == JCReasonScreenShareStop) {
            JCConferenceManager *confManager = [JCConferenceManager sharedManager];
            //停止请求共享的视频
            [confManager requestScreenVideoWithPictureSize:JCVideoPictureSizeOff];
            //渲染了屏幕共享视频的View 停止渲染,释放资源
            [confManager stopRender:renderView];
        } 
    }
}