屏幕采集
GetScreenCaptureSources
获取可共享的屏幕和窗口对象列表。
public abstract ScreenCaptureSourceInfo[] GetScreenCaptureSources(SIZE thumbSize, SIZE iconSize, bool includeScreen);
详情
屏幕共享或窗口共享前,你可以调用该方法获取可共享的屏幕和窗口的对象列表,方便用户通过列表中的缩略图选择共享某个显示器的屏幕或某个窗口。列表中包含窗口 ID 和屏幕 ID 等重要信息,你可以获取到 ID 后再调用 StartScreenCaptureByWindowId 或 StartScreenCaptureByDisplayId 开启共享。
参数
- thumbSize
- 屏幕或窗口的缩略图的目标尺寸(宽高单位为像素)。SDK 会在保证原图不变形的前提下,缩放原图,使图片最长边和目标尺寸的最长边的长度一致。例如,原图宽高为 400 × 300,thumbSize 为 100 x 100,缩略图实际尺寸为 100 × 75。如果目标尺寸大于原图尺寸,缩略图即为原图,SDK 不进行缩放操作。
- iconSize
- 程序所对应的图标的目标尺寸(宽高单位为像素)。SDK 会在保证原图不变形的前提下,缩放原图,使图片最长边和目标尺寸的最长边的长度一致。例如,原图宽高为 400 × 300,iconSize 为 100 × 100,图标实际尺寸为 100 × 75。如果目标尺寸大于原图尺寸,图标即为原图,SDK 不进行缩放操作。
- includeScreen
- 除了窗口信息外,SDK 是否返回屏幕信息:
true
:SDK 返回屏幕和窗口信息。false
:SDK 仅返回窗口信息。
返回值
所属接口类QueryScreenCaptureCapability
查询设备在屏幕共享时支持的最高帧率。
public abstract int QueryScreenCaptureCapability();
详情
适用场景
该方法仅适用于 Android 和 iOS。
在屏幕共享场景下,如果你想启用高帧率(如 60 fps)、但不确定设备是否支持时,可以先调用该方法查询设备支持的最高帧率。如果设备不支持高帧率,你可以在开启屏幕共享时适当调低屏幕共享流的帧率,以确保共享场景的效果符合预期。
返回值
- 方法调用成功时,返回设备支持的最高帧率。详见 SCREEN_CAPTURE_FRAMERATE_CAPABILITY。
- <0:方法调用失败。详见错误码了解详情和解决建议。
SetScreenCaptureContentHint
设置屏幕共享内容类型。
public abstract int SetScreenCaptureContentHint(VIDEO_CONTENT_HINT contentHint);
详情
SDK 会根据不同的内容类型,使用不同的算法对共享效果进行优化。如果不调用该方法,SDK 会将屏幕共享的内容默认为 CONTENT_HINT_NONE,即无指定的内容类型。
参数
- contentHint
- 屏幕共享的内容类型。详见 VIDEO_CONTENT_HINT。
返回值
- 0: 方法调用成功。
- < 0: 方法调用失败。详见错误码了解详情和解决建议。
- -2:传入的参数无效。
- -8:屏幕共享状态无效。可能因为你已经共享了其他屏幕或窗口。尝试调用 StopScreenCapture [1/2] 停止当前共享,再重新开始共享屏幕。
SetScreenCaptureScenario
设置屏幕共享的场景。
public abstract int SetScreenCaptureScenario(SCREEN_SCENARIO_TYPE screenScenario);
详情
开启屏幕共享或窗口共享时,你可以调用该方法设置屏幕共享的场景,SDK 会根据你设置的场景调整共享画面的画质。
参数
- screenScenario
- 屏幕共享的场景,详见 SCREEN_SCENARIO_TYPE。
返回值
- 0: 方法调用成功。
- < 0: 方法调用失败。详见错误码了解详情和解决建议。
StartScreenCapture [1/2]
开始屏幕采集。
public abstract int StartScreenCapture(ScreenCaptureParameters2 captureParams);
- 该方法仅适用于 Android 和 iOS 平台。
- 屏幕共享流的计费标准以 ScreenVideoParameters 中的 dimensions 值为准:
- 当你未传值时,以 1280 × 720 计费。
- 当你传值时,以你传入的值计费。
适用场景
在屏幕共享场景下,你需要调用该方法开始采集屏幕视频流。有关屏幕共享的实现方法,详见屏幕共享。
调用时机
- 如果在加入频道前调用该方法,然后调用 JoinChannel [2/2] 加入频道,并设置 publishScreenCaptureVideo 为
true
,即可开始屏幕共享。 - 如果在加入频道后调用该方法,然后调用 UpdateChannelMediaOptions 更新频道媒体选项,并设置 publishScreenCaptureVideo 为
true
,即可开始屏幕共享。
调用限制
- 在 iOS 平台上,屏幕共享仅适用于 iOS 12.0 及以上。
- 在 iOS 平台上,如果你使用音频自采集而非 SDK 采集音频,为避免应用退后台后屏幕共享停止,建议你对应用添加保活处理逻辑。
- 在 iOS 平台上,该功能对设备性能要求较高,建议你在 iPhone X 及之后机型上使用。
- 在 iOS 平台上,该方法依赖于屏幕共享动态库
AgoraReplayKitExtension.xcframework
,如果删除该动态库会导致无法正常开启屏幕共享。 - 在 Android 平台上,如果用户未授予 App 屏幕采集权限,SDK 会上报 OnPermissionError
(2)
回调。 - 在 Android 9 及之后版本上,为避免应用退后台后被系统杀死,建议你在
/app/Manifests/AndroidManifest.xml
文件中添加前台服务权限:android.permission.FOREGROUND_SERVICE
。 - 因 Android 性能限制,屏幕共享不支持 Android TV。
- 因 Android 系统限制,使用华为手机进行屏幕共享时,为避免崩溃,请不要在共享过程中调节屏幕共享流的视频编码分辨率。
- 因 Android 系统限制,部分小米手机不支持屏幕共享时采集系统音频。
- 为提高屏幕共享时采集系统音频的成功率,建议你在加入频道前通过 SetAudioScenario 方法设置音频场景为 AUDIO_SCENARIO_GAME_STREAMING。
参数
- captureParams
- 屏幕共享的编码参数配置。详见 ScreenCaptureParameters2。
返回值
- 0: 方法调用成功。
- < 0: 方法调用失败。详见错误码了解详情和解决建议。
- -2 (iOS 平台): 参数为空。
- -2 (Anroid 平台): 系统版本过低,请确保 Android API 级别不低于 21。
- -3 (Anroid 平台): 无法采集系统音频,请确保 Android API 级别不低于 29。
StartScreenCapture [2/2]
开始屏幕采集并指定视频源。
public abstract int StartScreenCapture(VIDEO_SOURCE_TYPE sourceType, ScreenCaptureConfiguration config);
适用场景
在屏幕共享场景下,你需要调用该方法开始采集屏幕视频流。
- StartScreenCapture [1/2]/StartScreenCaptureByDisplayId/StartScreenCaptureByWindowId:仅支持采集单个屏幕或窗口,适合仅共享单个屏幕的场景。
- StartScreenCapture [2/2]:支持指定多个视频源,以采集多路屏幕共享流,用于本地合图或者多频道发布场景。
调用时机
- 如果在加入频道前调用该方法,然后调用 JoinChannel [2/2] 加入频道,并设置 publishScreenCaptureVideo 为
true
,即可开始屏幕共享。 - 如果在加入频道后调用该方法,然后调用 UpdateChannelMediaOptions 更新频道媒体选项,并设置 publishScreenCaptureVideo 为
true
,即可开始屏幕共享。
调用限制
- 如果调用该方法开始屏幕采集,则停止屏幕采集时需要调用 StopScreenCapture [2/2] 。
- 在 Windows 平台上,最多支持 4 路屏幕采集的视频流。
- 在 macOS 平台上,最多支持 1 路屏幕采集的视频流。
参数
- sourceType
- 视频源的类型,详见 VIDEO_SOURCE_TYPE。注意在 macOS 平台上,仅支持将该参数设置为 VIDEO_SOURCE_SCREEN (2)。
- config
- 屏幕采集配置。详见 ScreenCaptureConfiguration。
返回值
- 0: 方法调用成功。
- < 0: 方法调用失败。详见错误码了解详情和解决建议。
StartScreenCaptureByDisplayId
开始采集指定屏幕的视频流。
public abstract int StartScreenCaptureByDisplayId(uint displayId, Rectangle regionRect, ScreenCaptureParameters captureParams);
采集一个屏幕或该屏幕部分区域的视频流。
适用场景
在屏幕共享场景下,你需要调用该方法开始采集屏幕视频流。有关屏幕共享的实现方法,详见屏幕共享。
调用时机
- 如果在加入频道前调用该方法,然后调用 JoinChannel [2/2] 加入频道,并设置 publishScreenTrack 或 publishSecondaryScreenTrack 为
true
,即可开始屏幕共享。 - 如果在加入频道后调用该方法,然后调用 UpdateChannelMediaOptions 更新频道媒体选项,并设置 publishScreenTrack 或 publishSecondaryScreenTrack 为
true
,即可开始屏幕共享。
调用限制
无。
参数
- displayId
- 指定待共享的屏幕 ID。信息对于 Windows 平台,如果你需要同时共享两个屏幕(主屏 + 副屏),可以在调用该方法时,将 displayId 设置为
-1
。 - regionRect
- (可选)指定待共享区域相对于整个屏幕的位置。如需共享整个屏幕,则填
nil
。详见 Rectangle。如果设置的共享区域超出了屏幕的边界,则只共享屏幕内的内容;如果宽或高设为 0,则共享整个屏幕。 - captureParams
- 屏幕共享的参数配置。默认的视频编码分辨率为 1920 × 1080,即 2073600 像素。该像素值为计费标准。详见 ScreenCaptureParameters。注意屏幕共享流的视频属性只需通过该参数设置,与 SetVideoEncoderConfiguration 无关。
返回值
- 0: 方法调用成功。
- < 0: 方法调用失败。详见错误码了解详情和解决建议。
- -2:传入的参数无效。
- -8:屏幕共享状态无效。可能因为你已经共享了其他屏幕或窗口。尝试调用 StopScreenCapture [1/2] 停止当前共享,再重新开始共享屏幕。
StartScreenCaptureByScreenRect
开始采集指定屏幕区域的视频流。
public abstract int StartScreenCaptureByScreenRect(Rectangle screenRect, Rectangle regionRect,
ScreenCaptureParameters captureParams);
详情
共享一个屏幕或该屏幕的部分区域。你需要在该方法中指定想要共享的屏幕区域。
- 如果在加入频道前调用该方法,然后调用 JoinChannel [2/2] 加入频道,并设置 publishScreenTrack 或 publishSecondaryScreenTrack 为
true
,即可开始屏幕共享。 - 如果在加入频道后调用该方法,然后调用 UpdateChannelMediaOptions 更新频道媒体选项,并设置 publishScreenTrack 或 publishSecondaryScreenTrack 为
true
,即可开始屏幕共享。
参数
- screenRect
- 指定待共享的屏幕相对于虚拟屏的位置。
- regionRect
- (可选)指定待共享区域相对于整个屏幕的位置。如不填,则表示共享整个屏幕。详见 Rectangle。如果设置的共享区域超出了屏幕的边界,则只共享屏幕内的内容;如果将 width 或 height 设为 0 ,则共享整个屏幕。
- captureParams
- 屏幕共享的编码参数配置。默认的分辨率为 1920 x 1080,即 2073600 像素。该像素值为计费标准。详见 ScreenCaptureParameters。
返回值
- 0: 方法调用成功。
- < 0: 方法调用失败。详见错误码了解详情和解决建议。
- -2:传入的参数无效。
- -8:屏幕共享状态无效。可能因为你已经共享了其他屏幕或窗口。尝试调用 StopScreenCapture [1/2] 停止当前共享,再重新开始共享屏幕。
StartScreenCaptureByWindowId
开始采集指定窗口的视频流。
public abstract int StartScreenCaptureByWindowId(view_t windowId, Rectangle regionRect, ScreenCaptureParameters captureParams);
共享一个窗口或该窗口的部分区域。用户需要在该方法中指定想要共享的窗口 ID。
该方法支持共享通用 Windows 平台(UWP)应用窗口。声网使用最新版 SDK 对主流的 UWP 应用进行了测试,结果如下:
系统版本 | 软件 | 软件版本 | 是否支持 |
---|---|---|---|
win10 | Chrome | 76.0.3809.100 | 否 |
Office Word | 18.1903.1152.0 | 是 | |
Office Excel | 否 | ||
Office PPT | 是 | ||
WPS Word | 11.1.0.9145 | 是 | |
WPS Excel | |||
WPS PPT | |||
Media Player(系统自带) | 全部 | 是 | |
win8 | Chrome | 全部 | 是 |
Office Word | 全部 | 是 | |
Office Excel | |||
Office PPT | |||
WPS Word | 11.1.0.9098 | 是 | |
WPS Excel | |||
WPS PPT | |||
Media Player(系统自带) | 全部 | 是 | |
win7 | Chrome | 73.0.3683.103 | 否 |
Office Word | 全部 | 是 | |
Office Excel | |||
Office PPT | |||
WPS Word | 11.1.0.9098 | 否 | |
WPS Excel | |||
WPS PPT | 11.1.0.9098 | 是 | |
Media Player(系统自带) | 全部 | 否 |
适用场景
在屏幕共享场景下,你需要调用该方法开始采集屏幕视频流。有关屏幕共享的实现方法,详见屏幕共享。
调用时机
- 如果在加入频道前调用该方法,然后调用 JoinChannel [2/2] 加入频道,并设置 publishScreenTrack 或 publishSecondaryScreenTrack 为
true
,即可开始屏幕共享。 - 如果在加入频道后调用该方法,然后调用 UpdateChannelMediaOptions 更新频道媒体选项,并设置 publishScreenTrack 或 publishSecondaryScreenTrack 为
true
,即可开始屏幕共享。
调用限制
SDK 的窗口共享功能依赖于 WGC(Windows Graphics Capture)或 GDI(Graphics Device Interface)采集,WGC 在早于 Windows 10 2004 的系统上无法设置关闭鼠标采集,因此,当你在搭载早于 Windows 10 2004 系统的设备上进行窗口共享时,可能出现 captureMouseCursor(false)
不生效的现象。详见 ScreenCaptureParameters。
参数
- windowId
- 指定待共享的窗口 ID。
- regionRect
- (可选)指定待共享区域相对于整个屏幕的位置。如不填,则表示共享整个屏幕。详见 Rectangle。如果设置的共享区域超出了窗口的边界,则只共享窗口内的内容;如果宽或高为 0,则共享整个窗口。
- captureParams
- 屏幕共享的参数配置。默认的分辨率为 1920 x 1080,即 2073600 像素。该像素值为计费标准。详见 ScreenCaptureParameters。
返回值
- 0: 方法调用成功。
- < 0: 方法调用失败。详见错误码了解详情和解决建议。
- -2:传入的参数无效。
- -8:屏幕共享状态无效。可能因为你已经共享了其他屏幕或窗口。尝试调用 StopScreenCapture [1/2] 停止当前共享,再重新开始共享屏幕。
StopScreenCapture [1/2]
停止屏幕采集。
public abstract int StopScreenCapture();
适用场景
如果你调用了 StartScreenCapture [1/2]、StartScreenCaptureByWindowId 或 StartScreenCaptureByDisplayId 开启屏幕采集,则停止屏幕采集时需要调用该方法。
调用时机
该方法在加入频道前后均可调用。
调用限制
无。
返回值
- 0: 方法调用成功。
- < 0: 方法调用失败。详见错误码了解详情和解决建议。
StopScreenCapture [2/2]
停止对指定的视频源进行屏幕采集。
public abstract int StopScreenCapture(VIDEO_SOURCE_TYPE sourceType);
适用场景
如果你调用了 StartScreenCapture [2/2] 开启一路或多路屏幕采集,则停止屏幕采集时需要调用该方法,并通过 sourceType 参数指定屏幕。
调用时机
该方法在加入频道前后均可调用。
调用限制
无。
参数
- sourceType
- 视频源的类型,详见 VIDEO_SOURCE_TYPE。
返回值
- 0: 方法调用成功。
- < 0: 方法调用失败。详见错误码了解详情和解决建议。
UpdateScreenCapture
更新屏幕采集的参数配置。
public abstract int UpdateScreenCapture(ScreenCaptureParameters2 captureParams);
详情
- 调用该方法并设置 captureAudio 为
true
。 - 调用 UpdateChannelMediaOptions 设置 publishScreenCaptureAudio 为
true
,即可发布屏幕采集的音频。
- 该方法仅适用于 Android 和 iOS 平台。
- 在 iOS 平台上,屏幕共享仅适用于 iOS 12.0 及以上。
参数
- captureParams
- 屏幕共享的编码参数配置。详见 ScreenCaptureParameters2。
返回值
- 0: 方法调用成功。
- < 0: 方法调用失败。
- -2:传入的参数无效。
- -8:屏幕共享状态无效。可能因为你已经共享了其他屏幕或窗口。尝试调用 StopScreenCapture [1/2] 停止当前共享,再重新开始共享屏幕。
UpdateScreenCaptureParameters
更新屏幕采集的参数配置。
public abstract int UpdateScreenCaptureParameters(ScreenCaptureParameters captureParams);
详情
- 该方法仅适用于 Windows 和 macOS 平台。
- 请在开启屏幕共享或窗口共享后调用该方法。
参数
- captureParams
- 屏幕共享的编码参数配置。详见 ScreenCaptureParameters。注意屏幕共享流的视频属性只需通过该参数设置,与 SetVideoEncoderConfiguration 无关。
返回值
- 0: 方法调用成功。
- < 0: 方法调用失败。详见错误码了解详情和解决建议。
- -2:传入的参数无效。
- -8:屏幕共享状态无效。可能因为你已经共享了其他屏幕或窗口。尝试调用 StopScreenCapture [1/2] 停止当前共享,再重新开始共享屏幕。
UpdateScreenCaptureRegion
更新屏幕采集的区域。
public abstract int UpdateScreenCaptureRegion(Rectangle regionRect);
详情
参数
- regionRect
- 待共享区域相对于整个屏幕或窗口的位置,如不填,则表示共享整个屏幕或窗口。详见 Rectangle。如果设置的共享区域超出了屏幕或窗口的边界,则只共享屏幕或窗口内的内容;如果将 width 或 height 设为 0,则共享整个屏幕或窗口。
返回值
- 0: 方法调用成功。
- < 0: 方法调用失败。详见错误码了解详情和解决建议。
- -2:传入的参数无效。
- -8:屏幕共享状态无效。可能因为你已经共享了其他屏幕或窗口。尝试调用 StopScreenCapture [1/2] 停止当前共享,再重新开始共享屏幕。