屏幕采集
getCount
getScreenCaptureSources
获取可共享的屏幕和窗口对象列表。
virtual IScreenCaptureSourceList* getScreenCaptureSources(const SIZE& thumbSize, const SIZE& iconSize, const bool includeScreen) = 0;
屏幕共享或窗口共享前,你可以调用该方法获取可共享的屏幕和窗口的对象列表,方便用户通过列表中的缩略图选择共享某个显示器的屏幕或某个窗口。列表中包含窗口 ID 和屏幕 ID 等重要信息,你可以获取到 ID 后再调用 startScreenCaptureByWindowId
或 startScreenCaptureByDisplayId
开启共享。
注: 该方法仅适用于 macOS 和 Windows。
参数
参数名 | 描述 |
---|---|
thumbSize | 屏幕或窗口的缩略图的目标尺寸(宽高单位为像素)。详见 |
iconSize | 程序所对应的图标的目标尺寸(宽高单位为像素)。详见 |
includeScreen | 除了窗口信息外,SDK 是否返回屏幕信息:
|
返回值
所属接口类getSourceInfo
获取指定的可共享窗口或屏幕的信息。
virtual ScreenCaptureSourceInfo getSourceInfo(unsigned int index) = 0;
获取到 IScreenCaptureSourceList
后,你可以传入指定的可共享窗口或屏幕的索引值,以获取到该窗口或屏幕的信息 ScreenCaptureSourceInfo
。
参数
参数名 | 描述 |
---|---|
index | 指定的可共享窗口或屏幕的索引。索引值范围为 [0, |
返回值
所属接口类queryScreenCaptureCapability
查询设备在屏幕共享时支持的最高帧率。
#if defined(__ANDROID__) || (defined(__APPLE__) && TARGET_OS_IOS)
virtual int queryScreenCaptureCapability() = 0;
#endif
v4.2.0
返回值
-
方法调用成功时,返回设备支持的最高帧率。详见
SCREEN_CAPTURE_FRAMERATE_CAPABILITY
。 -
<0:方法调用失败。详见
错误码
了解详情和解决建议。
release
virtual void release() = 0;
获取可共享的窗口和屏幕对象列表后,为避免内存泄露,请调用该方法释放 IScreenCaptureSourceList
,不要直接删除 IScreenCaptureSourceList
。
setScreenCaptureContentHint
设置屏幕共享内容类型。
virtual int setScreenCaptureContentHint(VIDEO_CONTENT_HINT contentHint) = 0;
SDK 会根据不同的内容类型,使用不同的算法对共享效果进行优化。如果不调用该方法,SDK 会将屏幕共享的内容默认为 CONTENT_HINT_NONE,即无指定的内容类型。
注意: 该方法在开始屏幕共享前后都能调用。
参数
参数名 | 描述 |
---|---|
contentHint | 屏幕共享的内容类型。详见 |
返回值
-
0: 方法调用成功。
-
< 0: 方法调用失败。
-
-2:传入的参数无效。
-
-8:屏幕共享状态无效。可能因为你已经共享了其他屏幕或窗口。尝试调用
stopScreenCapture [1/2]
停止当前共享,再重新开始共享屏幕。
-
setScreenCaptureScenario
设置屏幕共享的场景。
virtual int setScreenCaptureScenario(SCREEN_SCENARIO_TYPE screenScenario) = 0;
开启屏幕共享或窗口共享时,你可以调用该方法设置屏幕共享的场景,SDK 会根据你设置的场景调整共享画面的画质。
注: 声网建议你在加入频道前调用该方法。
参数
参数名 | 描述 |
---|---|
screenScenario | 屏幕共享的场景,详见 |
返回值
-
0: 方法调用成功。
-
< 0: 方法调用失败。详见
错误码
了解详情和解决建议。
startScreenCapture [1/2]
开始屏幕采集。
#if defined(__ANDROID__) || (defined(__APPLE__) && TARGET_OS_IOS)
virtual int startScreenCapture(const ScreenCaptureParameters2& captureParams) = 0;
#endif
开启屏幕共享有如下两种方案,你可以根据实际场景进行选择:
-
在加入频道前调用该方法,然后调用
joinChannel [2/2]
加入频道并设置publishScreenCaptureVideo
为true
,即可开始屏幕共享。 -
在加入频道后调用该方法,然后调用
updateChannelMediaOptions
设置publishScreenCaptureVideo
为true
,即可开始屏幕共享。
注意:
-
该方法仅适用于 Android 和 iOS 平台。
-
在 iOS 平台上,屏幕共享仅适用于 iOS 12.0 及以上。
-
屏幕共享流的计费以
ScreenVideoParameters
中的dimensions
值为准:当你未传值时,以 1280 × 720 计费;当你传值时,以你传入的值计费。详细的计费规则请参考计费说明
。 -
在 iOS 平台上,如果你使用音频自采集而非 SDK 采集音频,为避免应用退后台后屏幕共享停止,建议你对应用添加保活处理逻辑。
-
在 iOS 平台上,该功能对设备性能要求较高,建议你在 iPhone X 及之后机型上使用。
-
在 iOS 平台上,该方法依赖于屏幕共享动态库
AgoraReplayKitExtension.xcframework
,如果删除该动态库会导致无法正常开启屏幕共享。 -
在 Android 平台上,请确保用户已授予 app 屏幕采集权限。
-
请确保 Android API 级别不低于 21,否则 SDK 会报告错误码
和ERR_SCREEN_CAPTURE_PERMISSION_DENIED
(16)
。ERR_SCREEN_CAPTURE_SYSTEM_NOT_SUPPORTED
(2) -
如需在屏幕共享时采集系统音频,你还需确保 Android API 级别不低于 29,否则 SDK 会报告错误码
。ERR_SCREEN_CAPTURE_SYSTEM_AUDIO_NOT_SUPPORTED
(3) -
在 Android 9 及之后版本上,为避免应用退后台后被系统杀死,建议你在
/app/Manifests/AndroidManifest.xml
文件中添加前台服务权限:android.permission.FOREGROUND_SERVICE
。 -
因 Android 性能限制,屏幕共享不支持 Android TV。
-
因 Android 系统限制,使用华为手机进行屏幕共享时,为避免崩溃,请不要在共享过程中调节屏幕共享流的视频编码分辨率。
-
因 Android 系统限制,部分小米手机不支持屏幕共享时采集系统音频。
-
为提高屏幕共享时采集系统音频的成功率,建议你在加入频道前通过
setAudioScenario
方法设置音频场景为AUDIO_SCENARIO_GAME_STREAMING
。
参数
参数名 | 描述 |
---|---|
captureParams | 屏幕共享的编码参数配置。默认的分辨率为 1920 x 1080,即 2,073,600 像素。该像素值为计费标准。详见 |
返回值
-
0: 方法调用成功。
-
< 0: 方法调用失败
-
-2: 参数为空。
-
startScreenCapture [2/2]
开始屏幕采集。
virtual int startScreenCapture(VIDEO_SOURCE_TYPE sourceType, const ScreenCaptureConfiguration& config) = 0;
v4.2.0
该方法和 startScreenCapture [1/2]
、startScreenCaptureByDisplayId
和 startScreenCaptureByWindowId
均可以开启屏幕采集,区别如下:
-
startScreenCapture [1/2]
仅适用于移动端,该方法仅适用于桌面端。 -
startScreenCaptureByDisplayId
和startScreenCaptureByWindowId
仅支持采集单个屏幕或窗口;调用该方法可以通过sourceType
指定多个视频源,以采集多路屏幕共享流,用于本地合图或者多频道发布。
注意:
-
该方法仅适用于 macOS 和 Windows 平台。
-
如果调用该方法开始屏幕采集,声网建议你使用
stopScreenCapture [2/2]
停止采集,不要与stopScreenCapture [1/2]
混用。
参数
参数名 | 描述 |
---|---|
sourceType | 视频源的类型,详见
|
config | 屏幕采集配置。详见 |
startScreenCaptureByDisplayId
开始采集指定屏幕的视频流。
virtual int startScreenCaptureByDisplayId(uint32_t displayId, const Rectangle& regionRect,
const ScreenCaptureParameters& captureParams) = 0;
共享一个屏幕或该屏幕的部分区域。
开启屏幕共享有如下两种方案,你可以根据实际场景进行选择:
-
在加入频道前调用该方法,然后调用
joinChannel [2/2]
加入频道并设置publishScreenTrack
或publishSecondaryScreenTrack
为true
,即可开始屏幕共享。 -
在加入频道后调用该方法,然后调用
updateChannelMediaOptions
设置publishScreenTrack
或publishSecondaryScreenTrack
为true
,即可开始屏幕共享。
注意: 该方法仅适用于 Windows 和 macOS。
参数
参数名 | 描述 |
---|---|
displayId | 指定待共享的屏幕 ID。 |
regionRect | (可选)指定待共享区域相对于整个屏幕的位置。如需共享整个屏幕,则填 |
captureParams | 如果设置的共享区域超出了屏幕的边界,则只共享屏幕内的内容;如果宽或高设为 0,则共享整个屏幕。 |
返回值
-
0: 方法调用成功。
-
< 0: 方法调用失败。
-
-2:传入的参数无效。
-
-8:屏幕共享状态无效。可能因为你已经共享了其他屏幕或窗口。尝试调用
stopScreenCapture [1/2]
停止当前共享,再重新开始共享屏幕。
-
startScreenCaptureByScreenRect
开始采集指定屏幕区域的视频流。
virtual int startScreenCaptureByScreenRect(const Rectangle& screenRect,
const Rectangle& regionRect,
const ScreenCaptureParameters& captureParams) = 0;
该方法已废弃。请改用 startScreenCaptureByDisplayId
。如果你需要在设备外接其他显示屏的情况下开启屏幕共享,强烈建议你使用 startScreenCaptureByDisplayId
。
共享一个屏幕或该屏幕的部分区域。你需要在该方法中指定想要共享的屏幕区域。
开启屏幕共享有如下两种方案,你可以根据实际场景进行选择:
-
在加入频道前调用该方法,然后调用
joinChannel [2/2]
加入频道并设置publishScreenTrack
或publishSecondaryScreenTrack
为true
,即可开始屏幕共享。 -
在加入频道后调用该方法,然后调用
updateChannelMediaOptions
设置publishScreenTrack
或publishSecondaryScreenTrack
为true
,即可开始屏幕共享。
注意: 该方法仅适用于 Windows 平台。
参数
参数名 | 描述 |
---|---|
screenRect | 指定待共享的屏幕相对于虚拟屏的位置。 |
regionRect | (可选)指定待共享区域相对于整个屏幕的位置。如不填,则表示共享整个屏幕。详见 |
captureParams | 屏幕共享的编码参数配置。默认的分辨率为 1920 x 1080,即 2073600 像素。该像素值为计费标准。详见 |
返回值
-
0: 方法调用成功。
-
< 0: 方法调用失败。
-
-2:传入的参数无效。
-
-8:屏幕共享状态无效。可能因为你已经共享了其他屏幕或窗口。尝试调用
stopScreenCapture [1/2]
停止当前共享,再重新开始共享屏幕。
-
startScreenCaptureByWindowId
开始采集指定窗口的视频流。
virtual int startScreenCaptureByWindowId(view_t windowId,
const Rectangle& regionRect,
const ScreenCaptureParameters& captureParams) = 0;
共享一个窗口或该窗口的部分区域。用户需要在该方法中指定想要共享的窗口 ID。
开启屏幕共享有如下两种方案,你可以根据实际场景进行选择:
-
在加入频道前调用该方法,然后调用
joinChannel [2/2]
加入频道并设置publishScreenTrack
或publishSecondaryScreenTrack
为true
,即可开始屏幕共享。 -
在加入频道后调用该方法,然后调用
updateChannelMediaOptions
设置publishScreenTrack
或publishSecondaryScreenTrack
为true
,即可开始屏幕共享。
注意:
-
该方法仅适用于 macOS 和 Windows 平台。
-
SDK 的窗口共享功能依赖于 WGC(Windows Graphics Capture)或 GDI(Graphics Device Interface)采集,WGC 在早于 Windows 10 2004 的系统上无法设置关闭鼠标采集,因此,当你在搭载早于 Windows 10 2004 系统的设备上进行窗口共享时,可能出现
captureMouseCursor(false)
不生效的现象。详见ScreenCaptureParameters
。
该方法支持共享通用 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(系统自带) | 全部 | 否 |
参数
参数名 | 描述 |
---|---|
windowId | 指定待共享的窗口 ID。 |
regionRect | (可选)指定待共享区域相对于整个屏幕的位置。如不填,则表示共享整个屏幕。详见 |
captureParams | 屏幕共享的参数配置。默认的分辨率为 1920 x 1080,即 2073600 像素。该像素值为计费标准。详见 |
返回值
-
0: 方法调用成功。
-
< 0: 方法调用失败。
-
-2:传入的参数无效。
-
-8:屏幕共享状态无效。可能因为你已经共享了其他屏幕或窗口。尝试调用
stopScreenCapture [1/2]
停止当前共享,再重新开始共享屏幕。
-
stopScreenCapture [1/2]
stopScreenCapture [2/2]
停止屏幕采集。
virtual int stopScreenCapture(VIDEO_SOURCE_TYPE sourceType) = 0;
v4.2.0
调用 startScreenCapture [2/2]
开始一路或多路屏幕采集后,你可以通过调用该方法并设置 sourceType
停止指定屏幕采集。
注意:
-
该方法仅适用于 macOS 和 Windows 平台。
-
如果你调用
startScreenCapture [1/2]
、startScreenCaptureByWindowId
和startScreenCaptureByDisplayId
开始屏幕采集,声网建议你使用stopScreenCapture [1/2]
停止采集,不要与该方法混用。
参数
参数名 | 描述 |
---|---|
sourceType | 视频源的类型,详见 |
返回值
-
0: 方法调用成功。
-
< 0: 方法调用失败。详见
错误码
了解详情和解决建议。
updateScreenCapture
更新屏幕采集的参数配置。
virtual int updateScreenCapture(const ScreenCaptureParameters2& captureParams) = 0;
如果在开启屏幕共享时未采集系统音频、然后想要更新参数配置、发布系统音频,可参考以下步骤:
-
调用该方法并设置
captureAudio
为true
。 -
调用
updateChannelMediaOptions
设置publishScreenCaptureAudio
为true
,即可发布屏幕采集的音频。
注意:
-
该方法仅适用于 Android 和 iOS 平台。
-
在 iOS 平台上,屏幕共享仅适用于 iOS 12.0 及以上。
参数
参数名 | 描述 |
---|---|
captureParams | 屏幕共享的编码参数配置。默认的分辨率为 1920 x 1080,即 2073600 像素。该像素值为计费标准。详见 |
返回值
-
0: 方法调用成功。
-
< 0: 方法调用失败。
-
-2:传入的参数无效。
-
-8:屏幕共享状态无效。可能因为你已经共享了其他屏幕或窗口。尝试调用
stopScreenCapture [1/2]
停止当前共享,再重新开始共享屏幕。
-
updateScreenCaptureParameters
更新屏幕采集的参数配置。
virtual int updateScreenCaptureParameters(const ScreenCaptureParameters& captureParams) = 0;
注意:
-
该方法仅适用于 Windows 和 macOS 平台。
-
请在开启屏幕共享或窗口共享后调用该方法。
参数
参数名 | 描述 |
---|---|
captureParams | 屏幕共享的编码参数配置。默认的分辨率为 1920 x 1080,即 2073600 像素。该像素值为计费标准。详见 |
返回值
-
0: 方法调用成功。
-
< 0: 方法调用失败。
-
-2:传入的参数无效。
-
-8:屏幕共享状态无效。可能因为你已经共享了其他屏幕或窗口。尝试调用
stopScreenCapture [1/2]
停止当前共享,再重新开始共享屏幕。
-
updateScreenCaptureRegion
更新屏幕采集的区域。
virtual int updateScreenCaptureRegion(const Rectangle& regionRect) = 0;
注意: 请在开启屏幕共享或窗口共享后调用该方法。
参数
参数名 | 描述 |
---|---|
regionRect | 待共享区域相对于整个屏幕或窗口的位置,如不填,则表示共享整个屏幕或窗口。详见 |
返回值
-
0: 方法调用成功。
-
< 0: 方法调用失败。
-
-2:传入的参数无效。
-
-8:屏幕共享状态无效。可能因为你已经共享了其他屏幕或窗口。尝试调用
stopScreenCapture [1/2]
停止当前共享,再重新开始共享屏幕。
-