屏幕采集

  • Flutter

更新时间不可用

getScreenCaptureSources

获取可共享的屏幕和窗口对象列表。

Dart
Future<List<ScreenCaptureSourceInfo>> getScreenCaptureSources(
    {required Size thumbSize,
    required Size iconSize,
    required bool includeScreen});

屏幕共享或窗口共享前,你可以调用该方法获取可共享的屏幕和窗口的对象列表,方便用户通过列表中的缩略图选择共享某个显示器的屏幕或某个窗口。列表中包含窗口 ID 和屏幕 ID 等重要信息,你可以获取到 ID 后再调用 startScreenCaptureByWindowId 或 startScreenCaptureByDisplayId 开启共享。

注: 该方法仅适用于 macOS 和 Windows。

参数

参数名描述
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 仅返回窗口信息。
表格内容超出当前宽度,可横向滚动查看更多列。

返回值

ScreenCaptureSourceInfo 数组。

所属接口类

queryScreenCaptureCapability

查询设备在屏幕共享时支持的最高帧率。

Dart
Future<int> queryScreenCaptureCapability();

适用场景

在屏幕共享场景下,如果你想启用高帧率(如 60 fps)、但不确定设备是否支持时,可以先调用该方法查询设备支持的最高帧率。如果设备不支持高帧率,你可以在开启屏幕共享时适当调低屏幕共享流的帧率,以确保共享场景的效果符合预期。

返回值

所属接口类

setExternalMediaProjection

设置 SDK 外部的 MediaProjection 采集屏幕视频流。

Dart
Future<void> setExternalMediaProjection(int mediaProjection);

成功调用该方法后,你设置的外部 MediaProjection 会替换掉 SDK 申请的 MediaProjection 采集屏幕视频流。 当停止屏幕共享或销毁 RtcEngine 时,SDK 会自动释放 MediaProjection。

注: 该方法仅适用于 Android。 在调用该方法前,必须先申请 MediaProjection 权限。

适用场景

如果你具备自行申请 MediaProjection 的开发能力,可以直接使用该 MediaProjection 取代 SDK 申请的 MediaProjection 。以下列出两种使用场景:

  • 在定制系统的设备上,可避免系统弹窗(即需要用户授予屏幕采集权限),直接开始采集屏幕视频流。
  • 一个屏幕共享进程中存在一个或多个子进程,避免在子进程中自行创建对象的过程出错而导致采集失败。

调用时机

该方法需要在 startScreenCapture 之前调用。

参数

参数名描述
mediaProjection

一个 MediaProjection 对象,用于采集屏幕视频流。

表格内容超出当前宽度,可横向滚动查看更多列。

返回值

方法成功调用时,无返回值;方法调用失败时,会抛出 AgoraRtcException 异常,你需要捕获异常并进行处理。详见错误码了解详情和解决建议。

所属接口类

setScreenCaptureContentHint

设置屏幕共享内容类型。

Dart
Future<void> setScreenCaptureContentHint(VideoContentHint contentHint);

SDK 会根据不同的内容类型,使用不同的算法对共享效果进行优化。如果不调用该方法,SDK 会将屏幕共享的内容默认为 contentHintNone,即无指定的内容类型。

注: 该方法在开始屏幕共享前后都能调用。

参数

参数名描述
contentHint

屏幕共享的内容类型。详见 VideoContentHint。

表格内容超出当前宽度,可横向滚动查看更多列。

返回值

方法成功调用时,无返回值;方法调用失败时,会抛出 AgoraRtcException 异常,你需要捕获异常并进行处理。详见错误码了解详情和解决建议。

所属接口类

setScreenCaptureScenario

设置屏幕共享的场景。

Dart
Future<void> setScreenCaptureScenario(ScreenScenarioType screenScenario);

开启屏幕共享或窗口共享时,你可以调用该方法设置屏幕共享的场景,SDK 会根据你设置的场景调整共享画面的画质。

注: 声网建议你在加入频道前调用该方法。

参数

参数名描述
screenScenario

屏幕共享的场景,详见 ScreenScenarioType。

表格内容超出当前宽度,可横向滚动查看更多列。

返回值

方法成功调用时,无返回值;方法调用失败时,会抛出 AgoraRtcException 异常,你需要捕获异常并进行处理。详见错误码了解详情和解决建议。

所属接口类

startScreenCapture

开始屏幕采集。

Dart
Future<void> startScreenCapture(ScreenCaptureParameters2 captureParams);

注:

  • 该方法仅适用于 Android 和 iOS 平台。

  • 屏幕共享流的计费标准以 ScreenVideoParameters 中的 dimensions 值为准:

    • 当你未传值时,以 1280 × 720 计费。
    • 当你传值时,以你传入的值计费。
  • 在 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 方法设置音频场景为 audioScenarioGameStreaming。

适用场景

在屏幕共享场景下,你需要调用该方法开始采集屏幕视频流。有关屏幕共享的实现方法,详见屏幕共享。

调用时机

该方法在加入频道前后均可调用,区别如下:

  • 如果在加入频道前调用该方法,然后调用 joinChannel 加入频道,并设置 publishScreenCaptureVideo 为 true,即可开始屏幕共享。
  • 如果在加入频道后调用该方法,然后调用 updateChannelMediaOptions 更新频道媒体选项,并设置 publishScreenCaptureVideo 为 true,即可开始屏幕共享。

参数

参数名描述
captureParams

屏幕共享的编码参数配置。详见 ScreenCaptureParameters2。

表格内容超出当前宽度,可横向滚动查看更多列。

返回值

方法成功调用时,无返回值;方法调用失败时,会抛出 AgoraRtcException 异常,你需要捕获异常并进行处理。详见错误码了解详情和解决建议。

所属接口类

startScreenCaptureBySourceType

开始屏幕采集并指定视频源。

Dart
Future<void> startScreenCaptureBySourceType(
      {required VideoSourceType sourceType,
      required ScreenCaptureConfiguration config});

注: 该方法仅适用于 macOS 和 Windows 平台。

  • 如果调用该方法开始屏幕采集,则停止屏幕采集时需要调用 stopScreenCaptureBySourceType。
  • 在 Windows 平台上,最多支持 4 路屏幕采集的视频流。
  • 在 macOS 平台上,最多支持 1 路屏幕采集的视频流。

适用场景

在屏幕共享场景下,你需要调用该方法开始采集屏幕视频流。 SDK 支持一系列开启屏幕采集的方法,它们之间存在以下区别,请根据实际场景选用:

  • startScreenCaptureByDisplayId/startScreenCaptureByWindowId:仅支持采集单个屏幕或窗口,适合仅共享单个屏幕的场景。
  • startScreenCaptureBySourceType:支持指定多个视频源,以采集多路屏幕共享流,用于本地合图或者多频道发布场景。

调用时机

该方法在加入频道前后均可调用,区别如下:

  • 如果在加入频道前调用该方法,然后调用 joinChannel 加入频道,并设置 publishScreenCaptureVideo 为 true,即可开始屏幕共享。
  • 如果在加入频道后调用该方法,然后调用 updateChannelMediaOptions 更新频道媒体选项,并设置 publishScreenCaptureVideo 为 true,即可开始屏幕共享。

参数

参数名描述
sourceType

视频源的类型,详见 VideoSourceType。

注: 在 macOS 平台上,仅支持将该参数设置为 videoSourceScreen (2)。

config

屏幕采集配置。详见 ScreenCaptureConfiguration。

表格内容超出当前宽度,可横向滚动查看更多列。

返回值

方法成功调用时,无返回值;方法调用失败时,会抛出 AgoraRtcException 异常,你需要捕获异常并进行处理。详见错误码了解详情和解决建议。

所属接口类

startScreenCaptureByDisplayId

开始采集指定屏幕的视频流。

Dart
Future<void> startScreenCaptureByDisplayId(
    {required int displayId,
    required Rectangle regionRect,
    required ScreenCaptureParameters captureParams});

采集一个屏幕或该屏幕部分区域的视频流。

注: 该方法仅适用于 Windows 和 macOS。

适用场景

在屏幕共享场景下,你需要调用该方法开始采集屏幕视频流。有关屏幕共享的实现方法,详见屏幕共享。

调用时机

该方法在加入频道前后均可调用,区别如下:

  • 如果在加入频道前调用该方法,然后调用 joinChannel 加入频道,并设置 publishScreenTrack 或 publishSecondaryScreenTrack 为 true,即可开始屏幕共享。
  • 如果在加入频道后调用该方法,然后调用 updateChannelMediaOptions 更新频道媒体选项,并设置 publishScreenTrack 或 publishSecondaryScreenTrack 为 true,即可开始屏幕共享。

参数

参数名描述
displayId

指定待共享的屏幕 ID。

注: 对于 Windows 平台,如果你需要同时共享两个屏幕(主屏 + 副屏),可以在调用该方法时,将 displayId 设置为 -1。

regionRect

(可选)指定待共享区域相对于整个屏幕的位置。如需共享整个屏幕,则填 nil。 详见 Rectangle。

captureParams

屏幕共享的参数配置。默认的视频编码分辨率为 1920 × 1080,即 2073600 像素。该像素值为计费标准。详见 ScreenCaptureParameters。

注: 屏幕共享流的视频属性只需通过该参数设置,与 setVideoEncoderConfiguration 无关。

表格内容超出当前宽度,可横向滚动查看更多列。

返回值

方法成功调用时,无返回值;方法调用失败时,会抛出 AgoraRtcException 异常,你需要捕获异常并进行处理。详见错误码了解详情和解决建议。

所属接口类

startScreenCaptureByScreenRect

开始采集指定屏幕区域的视频流。

Dart
Future<void> startScreenCaptureByScreenRect(
    {required Rectangle screenRect,
    required Rectangle regionRect,
    required ScreenCaptureParameters captureParams});

废弃

弃用: 该方法已废弃。请改用 startScreenCaptureByDisplayId。如果你需要在设备外接其他显示屏的情况下开启屏幕共享,强烈建议你使用 startScreenCaptureByDisplayId。

共享一个屏幕或该屏幕的部分区域。你需要在该方法中指定想要共享的屏幕区域。 该方法在加入频道前后均可调用,区别如下:

  • 如果在加入频道前调用该方法,然后调用 joinChannel 加入频道,并设置 publishScreenTrack 或 publishSecondaryScreenTrack 为 true,即可开始屏幕共享。
  • 如果在加入频道后调用该方法,然后调用 updateChannelMediaOptions 更新频道媒体选项,并设置 publishScreenTrack 或 publishSecondaryScreenTrack 为 true,即可开始屏幕共享。

注: 该方法仅适用于 Windows 平台。

参数

参数名描述
screenRect

指定待共享的屏幕相对于虚拟屏的位置。

regionRect

指定待共享区域相对于整个屏幕的位置。如不填,则表示共享整个屏幕。详见 Rectangle。如果设置的共享区域超出了屏幕的边界,则只共享屏幕内的内容;如果将 width 或 height 设为 0 ,则共享整个屏幕。

captureParams

屏幕共享的编码参数配置。默认的分辨率为 1920 x 1080,即 2073600 像素。该像素值为计费标准。详见 ScreenCaptureParameters。

表格内容超出当前宽度,可横向滚动查看更多列。

返回值

方法成功调用时,无返回值;方法调用失败时,会抛出 AgoraRtcException 异常,你需要捕获异常并进行处理。详见错误码了解详情和解决建议。

所属接口类

startScreenCaptureByWindowId

开始采集指定窗口的视频流。

Dart
Future<void> startScreenCaptureByWindowId(
    {required int windowId,
    required Rectangle regionRect,
    required ScreenCaptureParameters captureParams});

共享一个窗口或该窗口的部分区域。用户需要在该方法中指定想要共享的窗口 ID。 该方法支持共享通用 Windows 平台(UWP)应用窗口。声网使用最新版 SDK 对主流的 UWP 应用进行了测试,结果如下:

系统版本软件名称兼容版本是否支持
Windows 10Chrome76.0.3809.100否
Office Word18.1903.1152.0是
Office Excel18.1903.1152.0否
Office PPT18.1903.1152.0是
WPS Word11.1.0.9145是
WPS Excel11.1.0.9145是
WPS PPT11.1.0.9145是
系统自带的 Media Player所有版本是
Windows 8Chrome所有版本是
Office Word所有版本是
Office Excel所有版本是
Office PPT所有版本是
WPS Word11.1.0.9098是
WPS Excel11.1.0.9098是
WPS PPT11.1.0.9098是
系统自带的 Media Player所有版本是
Windows 7Chrome73.0.3683.103否
Office Word所有版本是
Office Excel所有版本是
Office PPT所有版本是
WPS Word11.1.0.9098否
WPS Excel11.1.0.9098否
WPS PPT11.1.0.9098是
系统自带的 Media Player所有版本否
表格内容超出当前宽度,可横向滚动查看更多列。

注: 该方法仅适用于 macOS 和 Windows 平台。 SDK 的窗口共享功能依赖于 WGC(Windows Graphics Capture)或 GDI(Graphics Device Interface)采集,WGC 在早于 Windows 10 2004 的系统上无法设置关闭鼠标采集,因此,当你在搭载早于 Windows 10 2004 系统的设备上进行窗口共享时,可能出现 captureMouseCursor(false) 不生效的现象。详见 ScreenCaptureParameters。

适用场景

在屏幕共享场景下,你需要调用该方法开始采集屏幕视频流。有关屏幕共享的实现方法,详见屏幕共享。

调用时机

该方法在加入频道前后均可调用,区别如下:

  • 如果在加入频道前调用该方法,然后调用 joinChannel 加入频道,并设置 publishScreenTrack 或 publishSecondaryScreenTrack 为 true,即可开始屏幕共享。
  • 如果在加入频道后调用该方法,然后调用 updateChannelMediaOptions 更新频道媒体选项,并设置 publishScreenTrack 或 publishSecondaryScreenTrack 为 true,即可开始屏幕共享。

参数

参数名描述
windowId

指定待共享的窗口 ID。

regionRect

(可选)指定待共享区域相对于整个屏幕的位置。如不填,则表示共享整个屏幕。详见 Rectangle。如果设置的共享区域超出了窗口的边界,则只共享窗口内的内容;如果宽或高为 0,则共享整个窗口。

captureParams

屏幕共享的参数配置。默认的分辨率为 1920 x 1080,即 2073600 像素。该像素值为计费标准。详见 ScreenCaptureParameters。

表格内容超出当前宽度,可横向滚动查看更多列。

返回值

方法成功调用时,无返回值;方法调用失败时,会抛出 AgoraRtcException 异常,你需要捕获异常并进行处理。详见错误码了解详情和解决建议。

所属接口类

stopScreenCapture

停止屏幕采集。

Dart
Future<void> stopScreenCapture();

适用场景

如果你调用了 startScreenCaptureBySourceType、startScreenCaptureByWindowId 或 startScreenCaptureByDisplayId 开启屏幕采集,则停止屏幕采集时需要调用该方法。

调用时机

该方法在加入频道前后均可调用。

返回值

方法成功调用时,无返回值;方法调用失败时,会抛出 AgoraRtcException 异常,你需要捕获异常并进行处理。详见错误码了解详情和解决建议。

所属接口类

stopScreenCaptureBySourceType

停止对指定的视频源进行屏幕采集。

Dart
Future<void> stopScreenCaptureBySourceType(VideoSourceType sourceType);

注: 该方法仅适用于 macOS 和 Windows 平台。

适用场景

如果你调用了 startScreenCaptureBySourceType 开启一路或多路屏幕采集,则停止屏幕采集时需要调用该方法,并通过 sourceType 参数指定屏幕。

调用时机

该方法在加入频道前后均可调用。

参数

参数名描述
sourceType

视频源的类型,详见 VideoSourceType。

表格内容超出当前宽度,可横向滚动查看更多列。

返回值

方法成功调用时,无返回值;方法调用失败时,会抛出 AgoraRtcException 异常,你需要捕获异常并进行处理。详见错误码了解详情和解决建议。

所属接口类

updateScreenCapture

更新屏幕采集的参数配置。

Dart
Future<void> updateScreenCapture(ScreenCaptureParameters2 captureParams);

如果在开启屏幕共享时未采集系统音频、然后想要更新参数配置、发布系统音频,可参考以下步骤:

  1. 调用该方法并设置 captureAudio 为 true。
  2. 调用 updateChannelMediaOptions 设置 publishScreenCaptureAudio 为 true,即可发布屏幕采集的音频。

注:

  • 该方法仅适用于 Android 和 iOS 平台。
  • 在 iOS 平台上,屏幕共享仅适用于 iOS 12.0 及以上。

参数

参数名描述
captureParams

屏幕共享的编码参数配置。详见 ScreenCaptureParameters2。

表格内容超出当前宽度,可横向滚动查看更多列。

返回值

方法成功调用时,无返回值;方法调用失败时,会抛出 AgoraRtcException 异常,你需要捕获异常并进行处理。详见错误码了解详情和解决建议。

所属接口类

updateScreenCaptureParameters

更新屏幕采集的参数配置。

Dart
Future<void> updateScreenCaptureParameters(
      ScreenCaptureParameters captureParams);

注:

  • 该方法仅适用于 Windows 和 macOS 平台。
  • 请在开启屏幕共享或窗口共享后调用该方法。

参数

参数名描述
captureParams

屏幕共享的编码参数配置。详见 ScreenCaptureParameters。

注: 屏幕共享流的视频属性只需通过该参数设置,与 setVideoEncoderConfiguration 无关。

表格内容超出当前宽度,可横向滚动查看更多列。

返回值

方法成功调用时,无返回值;方法调用失败时,会抛出 AgoraRtcException 异常,你需要捕获异常并进行处理。详见错误码了解详情和解决建议。

所属接口类

updateScreenCaptureRegion

更新屏幕采集的区域。

Dart
Future<void> updateScreenCaptureRegion(Rectangle regionRect);

注: 请在开启屏幕共享或窗口共享后调用该方法。

参数

参数名描述
regionRect

待共享区域相对于整个屏幕或窗口的位置,如不填,则表示共享整个屏幕或窗口。详见 Rectangle。如果设置的共享区域超出了屏幕或窗口的边界,则只共享屏幕或窗口内的内容;如果将 width 或 height 设为 0,则共享整个屏幕或窗口。

表格内容超出当前宽度,可横向滚动查看更多列。

返回值

方法成功调用时,无返回值;方法调用失败时,会抛出 AgoraRtcException 异常,你需要捕获异常并进行处理。详见错误码了解详情和解决建议。

所属接口类