实时音视频
  • iOS
  • Android
  • macOS : Objective-C
  • Windows
  • HarmonyOS
  • Linux
  • Web
  • 小程序
  • Flutter
  • Electron
  • Unreal Engine
  • Unity3D
  • uni-app
  • React Native
  • Cocos Creator
  • 产品简介
  • 下载
  • 快速开始
    • 跑通示例源码
    • 集成 SDK
    • 实现视频通话
    • 场景化音视频配置
  • 通信能力
  • 房间能力
  • 音频能力
  • 视频能力
  • 直播能力
  • 其他能力
  • 最佳实践
  • 客户端 API
  • 服务端 API
  • 常见错误码
  • 常见问题
  • 文档中心
  • 实时音视频
  • 视频能力
  • 屏幕共享

屏幕共享

更新时间:2024-01-02 18:48

功能简介

屏幕共享,是指在视频通话或互动直播过程中将屏幕内容以视频的方式分享给其他的观众,以增强互动体验,提高沟通效率。

屏幕共享在如下场景中应用广泛:

  • 视频会议场景中,屏幕共享可以将讲话者本地的文件、数据、网页、PPT 等画面分享给其他与会人;
  • 在线课堂场景中,屏幕共享可以将老师的课件、笔记、讲课内容等画面展示给学生观看。

/Pics/Express/screen_share_scene_new.png

前提条件

在实现屏幕共享功能之前,请确保:

实现流程

  • 屏幕采集时,仅 iOS、Android 平台支持同时采集视频和音频;其他平台仅支持采集视频,如需采集音频,请开发者自行实现相关逻辑。
  • 如果您已经通过 ZEGO 旧版 屏幕共享 产品实现屏幕共享功能,或者需要自己实现屏幕共享功能,请参考 如何通过自定义采集实现屏幕共享?

调用屏幕共享接口在 mac 平台会获取相关权限,需要在 “安全性与隐私” 中开启录屏权限与辅助功能权限,如不生效需要将之前的权限删除再次新增。

  • 录屏权限
  • 辅助功能权限

1 获取窗口(包括屏幕)列表信息

SDK 可以通过 getScreenCaptureSourcesWithThumbnailSize 获取当前可共享的所有窗口信息。

NSArray<ZegoScreenCaptureSourceInfo *> *infoList = [engine getScreenCaptureSourcesWithThumbnailSize:CGSizeMake(400, 400) iconSize:CGSizeMake(100, 100)];

2 创建屏幕共享源

通过上述窗口信息里的窗口 ID 与窗口类型,调用 createScreenCaptureSource 接口创建屏幕共享源对象。

if (infoList.count > 0) {
    ZegoScreenCaptureSourceInfo *info = infoList[0];
    ZegoScreenCaptureSource *source = [engine createScreenCaptureSource:info.sourceID sourceType:info.sourceType];
}

3 设置采集源为屏幕共享源

SDK 推流的视频源默认为摄像头源,如果需要推屏幕共享源,需要通过 setVideoSource 进行切换为屏幕共享。

[engine setVideoSource:ZegoVideoSourceScreenCapture instanceID:source.getIndex.unsignedIntValue channel:ZegoPublishChannelMain];

4 启动共享

调用 startCapture 接口可以共享窗口画面。

[source startCapture];

5 更新共享源

调用 updateCaptureSource 接口可以更新共享窗口画面。

[source updateCaptureSource:infoList[1].sourceID sourceType:infoList[1].sourceType];

6 更新共享源区域

用户可以调用 updateCaptureRegion 接口动态更新共享窗口区域,其中设置为 (0, 0, 0, 0) 可恢复整个窗口共享。

[source updateCaptureRegion:CGRectMake(10, 10, 400, 400)];

7 过滤指定窗口

调用 setExcludeWindowList 接口可以过滤掉共享的屏幕中指定窗口画面,只适用于共享整个屏幕时进行设置。

[source setExcludeWindowList:@[@(infoList[1].sourceID), @(infoList[2].sourceID)]];

8 是否激活窗口

用户可以调用 enableWindowActivate 接口来激活当前共享的窗口。

[source enableWindowActivate:true];

9 是否显示鼠标

调用 enableCursorVisible 接口进行显示或隐藏鼠标。

[source enableCursorVisible:true];

10 设置事件回调

调用 setEventHandler 接口设置共享源事件回调。

[source setEventHandler:self];

···
// 采集数据回调,可用于本地录制。
- (void)screenCapture:(ZegoScreenCaptureSource *)source availableFrame:(const void *)data dataLength:(unsigned int)dataLength param:(ZegoVideoFrameParam *)param {

}

// 采集异常回调,当有异常回调时,会中断采集。
- (void)screenCapture:(ZegoScreenCaptureSource *)source exceptionOccurred:(ZegoScreenCaptureSourceExceptionType)type {

}

// 窗口采集状态回调,当窗口区域位置更改时,会通过此回调通知,当窗口不在当前屏幕区域内时,会停止采集。
- (void)screenCapture:(ZegoScreenCaptureSource *)source windowState:(ZegoScreenCaptureWindowState)state windowRect:(CGRect)rect {

}

11 登录房间并开始推流

调用 loginRoom 接口,传入房间 ID 参数 “roomID” 和用户参数 “user”,登录房间。

调用 startPublishingStream 接口,传入流 ID 参数 “streamID”,向远端用户发送本端的音视频流。

// 创建用户
ZegoUser *user = [ZegoUser userWithUserID:self.userID];

// 使用默认配置实例化 ZegoRoomConfig 配置对象
ZegoRoomConfig *roomConfig = [ZegoRoomConfig defaultConfig];

// 开始登录房间
[[ZegoExpressEngine sharedEngine] loginRoom:self.roomID user:user config:roomConfig];

// 开始推流
[[ZegoExpressEngine sharedEngine] startPublishingStream:publishStreamID];

至此,我们已完成采集屏幕数据并通过 ZEGO Express SDK 分享到远端的操作。

12 观看远端屏幕共享

完成以上步骤之后,其他用户可以使用 startPlayingStream 接口拉取屏幕共享流。

ZegoCanvas *playCanvas = [ZegoCanvas canvasWithView:self.remotePlayView];
playCanvas.viewMode = ZegoViewModeAspectFill;

NSString *playStreamID = self.playStreamIDTextField.stringValue;

[[ZegoExpressEngine sharedEngine] startPlayingStream:playStreamID canvas:playCanvas];

13 停止共享

用户可以调用 stopCapture 接口停止共享。

[source stopCapture];

14 销毁屏幕采集源对象

不再需要使用屏幕采集功能时,可调用 destroyScreenCaptureSource 接口销毁屏幕采集源对象。

[engine destroyScreenCaptureSource:source];
本篇目录