iOS

# 实现屏幕共享

# 简介

通过 Juphoon RTC SDK 可以在视频通话过程中实现屏幕共享,成员可以将自己的屏幕内容,以视频的方式分享给远端参会者,从而提升沟通效率,一般适用于一对一或多人视频通话、在线会议等在线金融场景。

  • 视频会议场景中,参会者可以在会议中将本地的文件、数据、网页、PPT 等画面分享给其他与会者,让其他与会者更加直观的了解讨论的内容和主题。
  • 在线金融场景中,本端可以通过屏幕共享或者窗口共享将风险揭示等画面展示给远端观看,远端也可将屏幕共享给本端观看,提升沟通效率。

# 1. 获取窗口/桌面列表

调用 getWindows (opens new window) 获取窗口列表。

/**
  * 获取当前窗口列表
  */
public abstract List<JRTCMediaDeviceWindow> getWindows();

调用 getDesktops (opens new window) 获取桌面列表。

/**
 * 获取当前桌面列表
 *
 * @return 桌面列表
 */
public abstract List<JRTCMediaDeviceDesktop> getDesktops();

示例代码:

// 获取窗口列表
List<JRTCMediaDeviceWindow> windows = mediaDevice.getWindows();

// 获取桌面列表
List<JRTCMediaDeviceWindow> desktops = mediaDevice.getDesktops();

# 2. 窗口/屏幕共享

支持共享窗口或或者桌面,窗口 ID 或屏幕 ID 通过 getWindows (opens new window)getDesktops (opens new window) 获取

/**
 * 开启/关闭屏幕共享
 * <p>
 * 成员开启或关闭屏幕共享,通话中的所有成员会收到 {@link JRTCGuestCallback#onCallPropertyChanged onCallPropertyChanged} 或 {@link JRTCAgentCallback#onCallPropertyChanged onCallPropertyChanged} 回调。
 *
 * @param enable      开启或关闭屏幕共享
 *                    - true: 开启屏幕共享
 *                    - false: 关闭屏幕共享
 * @param streamId 屏幕共享视频源(窗口ID或屏幕ID)
 * @return 接口调用结果
 * - true: 接口调用成功
 * - false: 接口调用异常
 */
public abstract boolean enableScreenOrWindowShare(boolean enable, String streamId);

# 3. 区域共享

支持共享窗口或或者桌面的部分区域

/**
 * 开启关闭区域共享
 *
 * @param enable      开启或关闭区域共享
 *                    - true: 开启屏幕共享
 *                    - false: 关闭屏幕共享
 * @param streamId 区域共享视频源(窗口ID或屏幕ID)
 * @param iFrameRate  帧率
 * @param top         上边距
 * @param bottom      下边距
 * @param left        左边距
 * @param right       右边距
 * @return 接口调用结果
 * - true: 接口调用成功
 * - false: 接口调用异常
 */
public abstract boolean enableScreenOrWindowShare(boolean enable, String streamId, int iFrameRate, int top, int bottom, int left, int right);

# 4. 是否由应用层自行控制屏幕采集逻辑

默认 false,由 SDK 内部根据通话业务开始/结束自动控制屏幕采集开启/关闭逻辑,比如加入房间时开启屏幕共享自动开启屏幕采集,关闭屏幕共享或者离开房间时时自动关闭屏幕采集。可通过接口setUseExternalScreenCaptureControl (opens new window)设置是否由应用层自行控制屏幕采集逻辑。在上述接口enableScreenOrWindowShare (opens new window)被使用时如果setUseExternalScreenCaptureControl为 true,则enableScreenOrWindowShare只负责信令通知,请确保开启屏幕共享前,已经开启了屏幕采集,否则远端用户收到屏幕共享画面为黑屏。

示例代码:

room.setUseExternalScreenCaptureControl(true);

# 5. 共享视频采集

您可以调用 JRTCMediaDevice (opens new window) 类中的 setScreenCaptureProperty (opens new window) 方法设置屏幕共享采集属性,包括采集的高度、宽度和帧速率。该方法可以在开启屏幕共享前调用,也可以在屏幕共享中调用;如果在屏幕共享中调用,则设置的采集属性要在下次屏幕共享开启时生效。

 /**
 * 设置屏幕共享采集属性
 * 在调用 {@link #enableScreenOrWindowCapture} 接口开启屏幕共享前设置即可生效
 *
 * @param width     采集宽度,默认640
 * @param height    采集高度,默认360
 * @param frameRate 采集帧速率,默认10
 */
public abstract void setScreenCaptureProperty(int width, int height, int frameRate);

/**
 * 开启/关闭屏幕采集
 *
 * @param enable   开启或关闭屏幕采集
 * @param streamId 窗口或者屏幕的ID
 * @return 接口调用结果
 * - true: 接口调用成功
 * - false: 接口调用异常
 */
public abstract boolean enableScreenOrWindowCapture(boolean enable, String streamId);

/**
 * 开启/关闭屏幕区域采集
 *
 * @param enable    开启或是关闭区域共享
 * @param streamId  窗口或者屏幕的ID
 * @param frameRate 采集帧率
 * @param top       上边距
 * @param bottom    下边距
 * @param left      左边距
 * @param right     右边距
 * @return 接口调用结果
 * - true: 接口调用成功
 * - false: 接口调用异常
 */
public abstract boolean enableScreenOrWindowAreaCapture(boolean enable, String streamId, int frameRate, int top, int bottom, int left, int right);

示例代码:

//设置屏幕共享采集属性
mediaDevice.setScreenCaptureProperty(1280, 720, 24);
开启/关闭采集
mediaDevice.enableScreenOrWindowCapture(true, "streamId");
开启/关闭区域采集
mediaDevice.enableScreenOrWindowCapture(true, "streamId"24, top,  bottom,  left,  right);

# 6. 暂停/恢复屏幕共享

/**
 * 暂停/继续屏幕共享
 * @note
 * 只有自己发起的屏幕共享可以使用该接口暂停,多次调用会覆盖
 * @param suspend true 暂停屏幕共享, false 继续屏幕共享
 * @param tip 暂停屏幕共享后提示文字
 * @return 接口调用结果
 * - true: 接口调用成功, 会收到 {@link JRTCGuestCallback#onCallPropertyChanged onCallPropertyChanged} 回调,可通过{@link #isSuspendScreenShare isSuspendScreenShare} 判断当前屏幕共享是否暂停
 * - false: 接口调用异常
 */
public abstract boolean suspendScreenShare(boolean suspend, String tip);

查询屏幕共享是否暂停

/**
 * 是否屏幕共享暂停
 * @return
 * - true: 暂停屏幕共享
 * - false: 未暂停屏幕共享
 */
public abstract boolean isSuspendScreenShare();

暂停/恢复屏幕共享变化事件通过实现 JRTCRoomCallback (opens new window) 中的 onRoomPropertyChanged (opens new window) 接口上报。

示例代码:

// 发起屏幕共享
room.suspendScreenShare(true,"屏幕共享暂停中");
// 通话属性变化回调
public void onCallPropertyChanged(PropChangeParam propChangeParam) {
    if (propChangeParam.screenShare) {
        if (room.isSuspendScreenShare) {
            //屏幕共享暂停中
        }
    }
}

# 7. 订阅/取消订阅屏幕共享的视频流

如果通话中有成员开启了屏幕共享,其他成员将收到 onRoomPropertyChanged (opens new window) 的回调,并通过 getShareUserId (opens new window) 获得发起屏幕共享的成员用户 ID。

/**
 * 通话属性改变回调
 *
 * @param propChangeParam 通话改变的属性
 * @note 重点关注屏幕共享,即当{@link JRTCRoom.PropChangeParam#screenShare screenShare} 属性为 true 时,去处理屏幕共享相关事件。<br>
 * 可根据 {@link JRTCGuest#getShareStreamId shareRenderId} 和 {@link JRTCGuest#getShareUserId shareUserId} 属性进行屏幕共享画面的渲染和停止渲染。
 */
void onCallPropertyChanged(JRTCRoom.PropChangeParam propChangeParam);

此时可以调用 requestScreenVideo (opens new window) 方法请求订阅屏幕共享的视频流。

/**
 * 订阅通话中屏幕共享的视频流
 *
 * @param videoSize 视频请求的尺寸,详见 {@link JRTCVideoSize}
 * @return 接口调用结果
 * - true: 接口调用成功
 * - false: 接口调用异常
 */
public abstract boolean requestScreenVideo(JRTCVideoSize videoSize);

取消订阅屏幕共享的视频流,如果不需要屏幕共享视频流,此时可以调用 unRequestScreenVideo (opens new window) 方法取消订阅屏幕共享的视频流,建议不使用时取消订阅屏幕共享的视频流,否则可能造成资源浪费。

 /**
 * 取消订阅通话中屏幕共享的视频流
 *
 * @return 接口调用结果
 * - true: 接口调用成功
 * - false: 接口调用异常
 */
public abstract boolean unRequestScreenVideo();

# 8. 渲染共享画面

获取屏幕共享相关参数 getShareUserId (opens new window)getShareStreamId (opens new window)

/**
 * 获取屏幕共享的视频流ID
 * 
 * 调用 {@link JRTCMediaDevice#startVideo startVideo} 接口渲染通话中其他成员的屏幕共享画面时使用。
 *
 * @return - 有屏幕共享时返回屏幕共享的视频流ID
 * - 无屏幕共享时返回 null
 */
public abstract String getShareStreamId();


/**
 * 获取发起屏幕共享者的用户ID
 * 
 * 可用来判断当前通话中是否有成员发起屏幕共享。
 *
 * @return - 有屏幕共享时返回发起屏幕共享者的用户ID
 * - 无屏幕共享时返回 null
 */
public abstract String getShareUserId();

屏幕共享开始/结束均通过实现 onRoomPropertyChanged (opens new window) 接口上报。

示例代码:

public void onCallPropertyChanged(JRTCRoom.PropChangeParam propChangeParam) {
    if (propChangeParam.ScreenShare){
        if (room.getShareUserId() != null && room.getShareUserId().length() > 0) {
            // 屏幕共享打开,可通过guest.getShareStreamId 渲染共享视频画面
        } else {
            // 屏幕共享关闭,可停止渲染共享视频画面
        }
    }
};

# 9. 设置屏幕采集数据为指定图片数据

设置屏幕采集数据为指定图片数据setScreenCaptureData (opens new window),需要传入替换图片。

room.setScreenCaptureData(img);

# 10. 重置屏幕采集数据

重置屏幕采集数据resetScreenCaptureData (opens new window)

room.resetScreenCaptureData();

# 11. 设置是否订阅屏幕共享

设置是否订阅屏幕共享setSubScreenShare (opens new window)

/**
 * 设置是否订阅屏幕共享
 *
 * @param enable 是否订阅屏幕共享
 * @return 接口调用结果
 * - true: 接口调用成功
 * - false: 接口调用异常
 */
room.setSubScreenShare();

# 12. 获取是否订阅屏幕共享

获取是否订阅屏幕共享isSubScreenShare (opens new window)返回屏幕共享是否订阅

boolean ret = room.isSubScreenShare();