WWDC Quick Look 💓 By SwiftGGTeam
Support the Center Stage front camera in your iOS app

Support the Center Stage front camera in your iOS app

观看原视频

Highlight

iPhone 17 系列的前置摄像头采用方形传感器和 95° 视角镜头,支持动态宽高比切换和智能取景,让你的自拍和视频通话自动适配画面中的人数和位置。

核心内容

以前用前置摄像头拍照有几个固定的烦恼。

横拍还是竖拍,你必须旋转手机。多人合影时,要找人帮忙或者伸长手臂。视频通话时,人稍微一移动就跑出画面,用户得手动调整位置。

iPhone 17、iPhone Air 和 iPhone 17 Pro 的前置摄像头从硬件层面解决了这些问题。

传感器是方形的,不再是传统的 4:3 矩形。这意味着你可以选择任何宽高比——横屏、竖屏、正方形——都不用旋转手机。镜头视角达到 95°,是 iPhone 前置摄像头中最宽的。配合人脸和注视检测,摄像头能自动缩放和旋转画面,把所有人框进来。

Apple 把这套能力封装成了两个 API:动态宽高比(Dynamic Aspect Ratio)和智能取景监视器(Smart Framing Monitor)。前者让你无缝切换画面方向,后者自动给出取景建议。

视频通话场景下,Center Stage 可以实时调整画面,让通话者始终居中。还有一个低延迟防抖模式,专门优化视频通话的稳定性。

详细内容

动态宽高比

(05:29)

动态宽高比是所有手动和自动取景的基础。iOS 26 开始,AVCaptureDevice 新增了 dynamicAspectRatio 属性。

设置这个属性后,摄像头会从方形传感器中裁剪出你选择的宽高比,无需重建 capture session 或中断预览。切换是实时的。

支持的设备类型是 .builtInUltraWideCamera(前置超广角),只支持方形格式,分辨率从 1280 到 4032。可用宽高比有五种:3:4、4:3、9:16、16:9 和 1:1。4032 格式只支持 3:4 和 4:3,因为这两个能提供最高照片分辨率。

实现一个”点击旋转”按钮,代码如下:

// 选择 Center Stage 前置摄像头
let discoverySession = AVCaptureDevice.DiscoverySession(
    deviceTypes: [.builtInUltraWideCamera],
    mediaType: .video,
    position: .front
)
guard let camera = discoverySession.devices.first else { return }

// 找到支持目标宽高比的格式
let desiredAspectRatio = AVCaptureDevice.AspectRatio.ratio4x3
let format = camera.formats.first { format in
    format.supportedDynamicAspectRatios.contains(desiredAspectRatio)
}

// 配置摄像头
try? camera.lockForConfiguration()
camera.activeFormat = format
camera.activeVideoMinFrameDuration = CMTime(value: 1, timescale: 30)

// 切换宽高比
let timestamp = camera.setDynamicAspectRatio(desiredAspectRatio)
camera.unlockForConfiguration()

关键点:

  • DiscoverySession 只查找 .builtInUltraWideCamera 类型的前置摄像头
  • supportedDynamicAspectRatios 返回格式支持的宽高比数组
  • setDynamicAspectRatio 返回变化生效时的第一帧时间戳
  • 切换过程不中断预览,用户看不到黑屏

智能取景监视器

(07:39)

自动缩放和自动旋转由 AVCaptureSmartFramingMonitor 驱动。它基于人脸和注视检测,定期给出取景建议——包含宽高比和缩放系数。你的应用可以选择采纳或忽略。

监视器只在 4032 照片格式下提供建议,这是因为它专为拍照场景设计。

设置代码:

// 摄像头已在动态宽高比步骤中选中
let format = camera.formats.first { format in
    format.supportedDynamicAspectRatios.contains(.ratio4x3) &&
    format.supportedFramings.contains(.smartFraming)
}

try? camera.lockForConfiguration()
camera.activeFormat = format
camera.unlockForConfiguration()

// 获取并配置智能取景监视器
let monitor = camera.smartFramingMonitor
monitor.enabledFramings = monitor.supportedFramings

// 观察取景建议
monitor.observe(\.recommendedFraming) { monitor, _ in
    guard let recommendation = monitor.recommendedFraming else { return }
    try? camera.lockForConfiguration()
    camera.setDynamicAspectRatio(recommendation.aspectRatio)
    camera.videoZoomFactor = recommendation.zoomFactor
    camera.unlockForConfiguration()
}

// 启动监视
monitor.startMonitoring()

关键点:

  • smartFramingMonitorAVCaptureDevice 的属性
  • enabledFramings 控制监视器推荐哪些取景方式,可限制为子集
  • 用 KVO 观察 recommendedFraming 属性获取实时建议
  • 建议包含 aspectRatiozoomFactor 两个值
  • 先设置宽高比,再设置缩放系数,预览过渡更平滑
  • stopMonitoring() 停止监视,removeObserver() 取消观察

传感器方向补偿

(10:05)

历代 iPhone 前置摄像头的传感器都是横向(Landscape Left)安装的。竖屏拍照时,图像缓冲区会带着 EXIF 方向标记,告诉播放器要旋转 270°。

iPhone 17 系列的 Center Stage 前置摄像头传感器改为竖向安装。如果你的代码依赖旧的旋转值,照片可能横着显示。

AVCapturePhotoOutput 默认会自动处理方向补偿——它会物理旋转照片,更新 EXIF 元数据,然后再交付给你的应用。结果照片和旧设备一样,是 landscape left 方向,你可以继续使用原来的旋转逻辑。

补偿只应用于 HEIC、JPEG 和未压缩的处理后照片,不应用于 Bayer RAW 或 Apple ProRAW。

iOS 26 新增 cameraSensorOrientationCompensationEnabled 属性,可以关闭这个行为。关闭后性能更好,但你要确保旋转处理正确。

Center Stage 视频通话

(14:44)

如果你的视频通话应用使用了 VoIP 后台模式,用户可以直接从控制中心的”视频效果”菜单开启 Center Stage。系统级别的视频效果(人像、演播室灯光、手势)都是按进程启用的,激活后对应用内所有支持的摄像头生效。

不使用 VoIP 模式的应用也可以手动启用 Center Stage,从 iPhone 17 系列开始支持。

// 选择支持的格式
let format = camera.formats.first { format in
    format.supportedCenterStage == true
}

try? camera.lockForConfiguration()
camera.activeFormat = format
camera.centerStageControlMode = .cooperative  // 允许用户从应用内控制
camera.isCenterStageEnabled = true
camera.unlockForConfiguration()

关键点:

  • supportedCenterStage 判断格式是否支持 Center Stage
  • centerStageControlModecooperative(用户可控制)和 app(仅应用控制)两种
  • isCenterStageEnabled 开启 Center Stage
  • 开启后画面会自动调整,保持所有人居中

低延迟防抖

(15:47)

Center Stage 前置摄像头还支持一个实时低延迟防抖模式,专门优化视频通话。

if let connection = videoOutput.connection(with: .video) {
    connection.preferredVideoStabilizationMode = .lowLatency
}

这个模式默认关闭。开启后,通话中的抖动会明显减少,画面更稳定。

核心启发

1. 自拍应用集成”智能合影”模式

做什么:用智能取景监视器自动检测画面中的人数,自动缩放和旋转,让所有人在按下快门前都出现在合适的构图里。

为什么值得做:多人自拍时总有人被裁掉或挤在边缘,用户需要反复调整位置和距离。智能取景监视器基于人脸和注视检测给出取景建议,应用自动采纳后用户只需按快门。

怎么开始:获取 AVCaptureDevicesmartFramingMonitor,启用 smartFraming,用 KVO 观察 recommendedFraming 变化,自动设置 dynamicAspectRatiovideoZoomFactor。入口 API:AVCaptureSmartFramingMonitor

2. 直播应用添加”横竖屏同播”

做什么:用动态宽高比让主播在不旋转手机的情况下切换横屏和竖屏,适应不同平台的推荐格式。

为什么值得做:不同直播平台推荐的画面比例不同(抖音竖屏 9:16,B站横屏 16:9),主播以前需要旋转手机或重新配置。动态宽高比切换实时生效,直播不中断,一个按钮就能适配多平台。

怎么开始:选择 .builtInUltraWideCamera 前置摄像头,找到支持目标宽高比的格式,调用 setDynamicAspectRatio(_:) 切换。入口 API:camera.setDynamicAspectRatio(.ratio16x9)

3. 视频会议应用优化”多人入会”体验

做什么:启用 Center Stage 和低延迟防抖,当有人走进画面时自动扩宽画面,所有人都能被看到,且手持走动时画面稳定。

为什么值得做:视频会议中人员变动频繁,有人加入时画面可能框不住所有人,手持设备时的抖动也让对方看得不舒服。Center Stage 自动跟踪人物,低延迟防抖减少画面晃动,提升通话质量。

怎么开始:选择 supportedCenterStage 格式,设置 centerStageControlMode = .cooperative,开启 isCenterStageEnabled,视频连接设置 preferredVideoStabilizationMode = .lowLatency。入口 API:camera.isCenterStageEnabled = true + connection.preferredVideoStabilizationMode = .lowLatency

4. 社交应用增加”自拍姿势引导”

做什么:结合智能取景监视器的建议,在预览界面显示视觉提示,告诉用户”向左移动一点”、“后退能拍得更全”。

为什么值得做:普通用户不懂构图规则,拍出来的自拍经常构图失衡。把监视器的取景建议翻译成直观的视觉引导,能帮用户拍出更好的照片,提升应用的拍照体验。

怎么开始:观察 smartFramingMonitor.recommendedFraming 的变化,对比当前取景和建议取景的差异,在预览层叠加箭头或文字提示,引导用户调整位置。入口 API:monitor.observe(\.recommendedFraming)

5. 相机应用支持”180° 拍照”

做什么:利用方形传感器和 95° 视角,让用户一次拍照覆盖前后两个方向,后期拼接成全景或对比图。

为什么值得做:iPhone 17 的方形传感器和 95° 超广角是前置摄像头中最宽的,一次拍摄能覆盖比传统前置更大的视野范围。利用这个特性可以创造新的拍照玩法,如前后景同框、超广自拍等。

怎么开始:使用 .builtInUltraWideCamera 的 4032 分辨率格式(最大视野),拍摄后利用超广角覆盖的范围做图像拼接或创意裁剪。入口 API:camera.formats 中筛选最大分辨率 + .builtInUltraWideCamera

关联 Session

评论

GitHub Issues · utterances