Capture cinematic video in your app
2025年6月9日
一句话判断
Cinematic Video API 把电影模式的核心能力变成了几行 AVCaptureSession 配置 — 一个 isCinematicVideoCaptureEnabled = true 就能让所有输出获得浅景深效果,包括录视频、拍照、预览,甚至支持手动对焦和跟踪对焦。
这场 Session 讲了什么
Roy 演示了如何用 Cinematic Video API 构建完整的电影模式拍摄体验:
核心原理:电影模式的核心是浅景深(bokeh)和智能对焦。算法自动检测进入画面的主体并 rack focus 到他们,跟踪移动的主体,主体转头时自动切换焦点。
一行开启电影模式:在 AVCaptureDeviceInput 上设置 isCinematicVideoCaptureEnabled = true,整个 capture session 的所有输出自动获得电影效果。AVCaptureMovieFileOutput 产出的视频包含 disparity data、metadata 和原始视频,支持非破坏性编辑。AVCaptureVideoDataOutput 的帧直接带有浅景深效果。AVCaptureVideoPreviewLayer 实时渲染 bokeh。
格式要求:Dual Wide 和 TrueDepth 摄像头均支持 1080p 和 4K @ 30fps。支持 SDR(420 video range/full range)和 10-bit HDR(x420)。
三种手动对焦方式:
setCinematicVideoTrackingFocus— 通过 detectedObjectID 对特定主体对焦,支持 strong(锁定跟踪)和 weak(算法可自动切换)模式。setCinematicVideoTrackingFocus(at:focusMode:)— 对画面中某一点对焦,算法会寻找该点的显著对象。setCinematicVideoFixedFocus— 固定焦距对焦,基于深度信息锁定特定平面。
UI 交互逻辑:点击未对焦的检测框 -> weak focus;点击已 weak focus 的检测框 -> 升级为 strong focus;点击空白区域 -> 寻找显著对象并 weak focus;长按 -> strong fixed focus。
高级特性:录制过程中可同时拍照(加 AVCapturePhotoOutput 即可,自动获得电影效果)。光线不足时通过 KVO cinematicVideoCaptureSceneMonitoringStatuses 获取提示。
值得深挖的点
-
isCinematicVideoCaptureEnabled的设计哲学很 Apple。一个属性开关搞定整个 session 的电影模式配置,所有输出自动适配。不需要分别配置每个 output。 -
metadata output 的
requiredMetadataObjectTypesForCinematicVideoCapture是硬性要求。如果 Cinematic 开启但 metadata types 不匹配,会抛异常。算法需要人脸检测等 metadata 来驱动自动对焦决策。 -
strong vs weak focus 的选择决定了用户体验。strong 适合”我就是要跟踪这个人”的场景(如采访),weak 适合让算法智能决策的日常拍摄。在你的 app UI 中清晰区分这两种模式。
-
录制中同时拍照的能力容易被忽略。加一个
AVCapturePhotoOutput到已配置为 Cinematic 的 session 中,照片自动带有 bokeh 效果,不需要额外配置。
代码片段
配置 Cinematic capture session:
// 找到支持 Cinematic 的格式
let format = device.formats.first {
$0.isCinematicVideoCaptureSupported
}
device.activeFormat = format
// 创建 input 并开启 Cinematic
let videoInput = try AVCaptureDeviceInput(device: device)
videoInput.isCinematicVideoCaptureEnabled = true
// 添加到 session
session.addInput(videoInput)
// 配置 metadata output(Cinematic 必需)
let metadataOutput = AVCaptureMetadataOutput()
metadataOutput.metadataObjectTypes =
device.requiredMetadataObjectTypesForCinematicVideoCapture
session.addOutput(metadataOutput)
手动对焦逻辑:
func handleTap(at point: CGPoint) {
if let obj = findTappedMetadataObject(at: point) {
if obj.cinematicVideoFocusMode == .weak {
// 升级为 strong focus
device.setCinematicVideoTrackingFocus(
detectedObjectID: obj.objectID,
focusMode: .strong
)
} else {
// weak focus
device.setCinematicVideoTrackingFocus(
detectedObjectID: obj.objectID,
focusMode: .weak
)
}
} else {
// 寻找显著对象
device.setCinematicVideoTrackingFocus(at: point, focusMode: .weak)
}
}
func handleLongPress(at point: CGPoint) {
device.setCinematicVideoFixedFocus(at: point, focusMode: .strong)
}
最佳实践
-
开启视频稳定化。推荐
cinematicExtendedEnhanced模式,手持拍摄的稳定性直接影响电影感体验。 -
必须配置 metadata output。Cinematic 算法依赖人脸检测等 metadata,不要遗漏这一步。
-
光线不足时给用户提示。KVO
cinematicVideoCaptureSceneMonitoringStatuses,当值包含notEnoughLight时在 UI 中显示警告。 -
用
simulatedAperture控制 bokeh 强度。值用 f-stop 表示(f 数值越小,光圈越大,bokeh 越强)。用 format 的 min/max/default 约束 slider 范围。 -
坐标空间转换不要搞错。metadata 的 bounds 需要用
layerRectConverted(fromMetadataOutputRect:)转换到 preview layer 坐标空间。AVFoundation 用左上角原点,SwiftUI 的 position 用中心点。
还有什么值得关注
- WWDC23 的 “Support Cinematic mode videos in your app” 介绍了 Cinematic Framework 的编辑/回放能力,与本次的 capture API 配套使用。
- 空间音频(first order ambisonics)可以与 Cinematic capture 配合,提升沉浸感。
- Cinematic Video 支持 Dual Wide 后置和 TrueDepth 前置摄像头,覆盖自拍和后拍两个场景。