Windows端屏幕分享功能分为屏幕分享(支持指定区域进行分享)和窗口分享,应用侧可根据实际需求分享屏幕内容并进行推流。通过阅读本文,您可以了解到Windows端屏幕分享的方法。
屏幕分享
- 推流端创建 SDK 实例后,通过接口 getScreenShareSourceInfo 可以获取当前屏幕分享源,其中参数 source_type 指定 AliRtcScreenShareDesktop,然后 SDK 通过 source_list 参数返回当前设备所有显示器设备。
AliRtcEngine *pEngine = AliRtcEngine::Create(""); // 获取屏幕分享source AliEngineScreenSourceList sourceList = pEngine->getScreenShareSourceInfo(AliEngineScreenShareDesktop); // 遍历所有支持屏幕 for (int i = 0; i < sourceList.sourceNum; i++) { }
说明 屏幕分享只有在当前设备接入显示器超过1个时,会返回多个source。 - 通过接口 StartScreenShareByDesktopId 设置屏幕分享 config 并根据桌面ID进行屏幕分享。其中 desktopId 设置为需要分享的屏幕 desktopId(上一步骤中获取),同时如果业务需要只分享屏幕中的部分区域,则设置 config 参数中的 isShareByRegion 字段为 true,同时将要分享区域的左上角坐标和宽高,赋值给 config 参数中的 shareRegion 变量。
// 设置屏幕分享源为屏幕分享,并指定分享屏幕source id AliEngineScreenShareConfig config; // 如果需要按区域分享,则设置isShareByRegion为true,并指定分享区域,如分享屏幕左上角100 x 100的区域 config.isShareByRegion = true; source.shareRegion.originX = 0.f; source.shareRegion.originY = 0.f; source.shareRegion.width = 100.f; source.shareRegion.height = 100.f; // 设置分享内容 pEngine->StartScreenShareByDesktopId(desktopId, config);
说明 按区域分享时,设置分享区域最小分辨率为 16x16,设置区域小于最小分辨率时重置为最小分辨率;按区域分享时,设置分享区域超过实际桌面分辨率时,将按照完整桌面分辨率分享。 - 共享后通过回调判断屏幕共享是否发布成功。
void OnScreenSharePublishStateChanged(AliEnginePublishState oldState, AliEnginePublishState newState, int elapseSinceLastState, const char *channel);
名称 类型 描述 oldState AliEnginePublishState 之前的推流状态。 newState AliEnginePublishState 当前的推流状态。 elapseSinceLastState int 状态变更时间间隔。 channel const char * 当前频道ID。 - 结束分享时,配置屏幕共享流停推。
// 配置屏幕分享停止 pEngine->StopScreenShare();
- 停推屏幕共享流之后通过回调判断屏幕共享是否取消发布成功。
void OnScreenSharePublishStateChanged(AliEnginePublishState oldState, AliEnginePublishState newState, int elapseSinceLastState, const char *channel);
名称 类型 描述 oldState AliEnginePublishState 之前的推流状态。 newState AliEnginePublishState 当前的推流状态。 elapseSinceLastState int 状态变更时间间隔。 channel const char * 当前频道ID。
窗口分享
- 推流端创建 SDK 实例后,通过接口 getScreenShareSourceInfo 可以获取当前屏幕分享源,其中参数 sourceType 指定 AliEngineScreenShareWindow,然后 SDK 通过 sourceList 参数返回当前设备所有显示器设备。
AliRtcEngine *pEngine = AliRtcEngine::Create(""); // 获取屏幕分享source AliEngineScreenSourceList sourceList = pEngine->getScreenShareSourceInfo(AliEngineScreenShareWindow); // 遍历所有支持屏幕 for (int i = 0; i < sourceList.sourceNum; i++) { }
说明 SDK 只会返回所有当前可见(没有最小化且 Size 不为 0)的窗口作为分享源。 - 通过接口 StartScreenShareByWindowId 设置屏幕分享 windowId 和 config,其中 windowId 参数设置为需要分享窗口 id(上一步骤中获取)。同时如果业务需要只分享屏幕中的部分区域,则设置 config 参数中的 isShareByRegion 字段为 true,同时将要分享区域的左上角坐标和宽高,赋值给 config 参数中的 shareRegion 变量。
// 设置屏幕分享源为屏幕分享,并指定分享屏幕source id AliEngineScreenShareConfig config; // 如果需要按区域分享,则设置isShareByRegion为true,并指定分享区域,如分享屏幕左上角100 x 100的区域 config.isShareByRegion = true; source.shareRegion.originX = 0.f; source.shareRegion.originY = 0.f; source.shareRegion.width = 100.f; source.shareRegion.height = 100.f; // 设置分享内容 pEngine->StartScreenShareByWindowId(windowId, config);
- 共享后通过回调判断屏幕共享是否发布成功。
void OnScreenSharePublishStateChanged(AliEnginePublishState oldState, AliEnginePublishState newState, int elapseSinceLastState, const char *channel);
名称 类型 描述 oldState AliEnginePublishState 之前的推流状态。 newState AliEnginePublishState 当前的推流状态。 elapseSinceLastState int 状态变更时间间隔。 channel const char * 当前频道ID。 - 结束分享时,配置屏幕共享流停推。
// 配置屏幕分享停止 pEngine->StopScreenShare();
- 停推屏幕共享流之后通过回调判断屏幕共享是否取消发布成功。
void OnScreenSharePublishStateChanged(AliEnginePublishState oldState, AliEnginePublishState newState, int elapseSinceLastState, const char *channel);
名称 类型 描述 oldState AliEnginePublishState 之前的推流状态。 newState AliEnginePublishState 当前的推流状态。 elapseSinceLastState int 状态变更时间间隔。 channel const char * 当前频道ID。
订阅端
订阅端用户可通过自动或手动方式订阅推流端屏幕分享视频流,并设置对应View显示,详情请参见AliRtcEngine接口。