What's new in ScreenCaptureKit
System & Services 进阶 20m

ScreenCaptureKit 新特性:演讲者叠加、屏幕共享选择器与高清截图

What's new in ScreenCaptureKit

2023年6月5日

在 Apple 官方观看视频

一句话判断

如果你在做屏幕共享或视频会议类应用,macOS Sonoma 的 ScreenCaptureKit 更新值得一看——Presenter Overlay 让演讲者嵌入共享画面中,系统级屏幕共享选择器简化了内容选择流程,还有全新的高清截图 API。

这场 Session 讲了什么

macOS 14 的 ScreenCaptureKit 带来了三大新功能:Presenter Overlay(演讲者叠加)、SCContentSharingPicker(系统级屏幕共享选择器)和高清截图 API。

Presenter Overlay 让演讲者在屏幕共享时将自己嵌入到共享内容中。有两种模式:Small Overlay 将演讲者放在一个可移动的小窗口中;Large Overlay 使用高级分割算法将演讲者的面部和身体从背景中分离出来,然后把屏幕内容嵌入到演讲者和背景之间,形成更沉浸的效果。这个功能对使用 ScreenCaptureKit 的应用自动生效——当应用同时使用摄像头和屏幕共享流时,Video 菜单栏中会出现 Presenter Overlay 的启用选项。

SCContentSharingPicker 是一个系统级的 UI 组件,让用户可以选择要共享的窗口、应用或显示器。之前你需要自己用 SCSharableContent 构建内容选择界面,现在系统提供了一个标准的、与其他应用一致的体验。它通过代理回调将 SCContentFilter 返回给你的应用,你可以直接用这个 filter 创建或更新 SCStream。

高清截图 API 让你可以截取任意屏幕内容的高清静态图像,不再需要从视频流中抓帧。

值得深挖的点

Presenter Overlay 对摄像头流的影响:当 Overlay 开启后,AVCaptureSession 不会发送正常的摄像头预览流,因为摄像头被 Overlay 直接使用了。视频会议应用需要在这个时机更新 UI——比如隐藏演讲者自己的摄像头小窗口,调整音视频同步参数。

系统级集成的设计哲学:苹果为所有使用 ScreenCaptureKit 的应用创建了一个统一的 Video 菜单栏入口。用户可以从这里控制所有活跃的屏幕共享流、启用 Presenter Overlay、切换共享内容。这意味着用户不需要在每个应用中单独学习屏幕共享的操作方式。

SCContentSharingPicker 的生命周期:你需要设置 picker 为 active 状态,系统才能将你的应用纳入 Video 菜单栏。picker 提供了完整的代理回调:新流请求、内容过滤器更新、选择器失败等。

代码片段

监听 Presenter Overlay 状态变化:

// 创建流并设置代理
let stream = SCStream(filter: contentFilter, configuration: config, delegate: self)

// 实现代理方法,监听 Overlay 状态
func stream(_ stream: SCStream, outputEffectDidStart effect: SCStreamEffect) {
    // Presenter Overlay 已启用
    // 更新 UI:隐藏本地摄像头预览
    // 调整音视频同步参数
}

func stream(_ stream: SCStream, outputEffectDidStop effect: SCStreamEffect) {
    // Presenter Overlay 已关闭
    // 恢复正常的摄像头预览
}

使用系统级屏幕共享选择器:

// 获取共享选择器单例并添加观察者
let picker = SCContentSharingPicker.shared()
picker.add(self)

// 设置为活跃状态,让系统识别你的 picker
picker.isActive = true

// 展示选择器 UI
picker.present(nil, using: .normal)

// 实现代理方法,接收用户选择的内容过滤器
func contentSharingPicker(_ picker: SCContentSharingPicker,
                          didUpdate contentFilter: SCContentFilter) {
    // 使用新的 contentFilter 更新现有流
    stream.updateContentFilter(contentFilter)
}

func contentSharingPicker(_ picker: SCContentSharingPicker,
                          didChange pickerState: SCContentSharingPickerState) {
    // 选择器状态变化(展示、关闭、失败等)
}

最佳实践

  • 检测到 Presenter Overlay 启用后,及时调整视频会议的 UI 布局和音视频同步
  • 使用 SCContentSharingPicker 而非自建内容选择界面,保证与其他应用体验一致
  • 设置 picker.isActive = true 后,系统才会将你的应用纳入 Video 菜单栏
  • 处理 picker 展示失败的回调,提供备用方案
  • 高清截图 API 适用于生成文档、报告等场景,不要用于替代视频流抓帧

还有什么值得关注

  • Presenter Overlay 的分割算法在不同光照条件下的表现
  • SCContentSharingPicker 是否支持自定义 UI 主题或品牌化
  • 高清截图 API 的性能影响和适用分辨率
  • 第三方视频会议应用(Zoom、Teams)对 Presenter Overlay 的适配进度
WWDC 2023