点击对焦 / 中断事件 / 视频稳定化
以下是三个小但重要的控制点:
- 点击对焦 / 点击测光(focus / exposure point of interest)
- 会话中断通知(来电、被别的 App 抢相机、系统降温)
- 录像的视频稳定化
都属于 device / connection 层的设置,不影响 input / output 怎么挂。
点击对焦 / 点击测光
AVCaptureDevice 暴露了一个 focus point 和一个 exposure point,都是 传感器坐标系 0..1 归一化(不是 preview 视图坐标系),(0, 0) 在传感器横向放置时的左上角。常见做法是把 preview 上的点击位置算成归一化的传感器坐标后,同时写焦点和曝光点:
注意点:
- 不支持 POI 的设备上
setFocusPointOfInterest/setExposurePointOfInterest是 silent no-op;想给用户反馈的话用is*Supported提前判断。 - 这两个 setter 内部已经拿了配置锁,不需要你自己包
lockForConfiguration()。 - 只设 point 不会触发对焦,还要配合 focus / exposure mode 切换(
autoFocus单次、continuousAutoFocus跟踪)。
会话中断
iOS 会在某些情况下把相机硬件从你手里抢走:来电、另一个 App 在多任务前台用相机、FaceTime 占用前置、设备热降频。session 不会停,但被挂起——预览会卡住,直到 iOS 把硬件还回来。
订阅这两个事件:
reason 是以下之一:
event === "ended" 时 reason 一律是空字符串——结束没有"原因"。
中断结束后不需要重新 startRunning(),session 会自动恢复。
视频稳定化
系统可以在录像上应用光学/传感器稳定化。你在 movie output 的视频连接上设置一个期望模式,系统结合 active format 和设备能力决定实际激活哪个。要知道实际开了什么,读回 active 模式即可。
要点:
- 稳定化作用在 connection 上,不是 session。换 device input 或重建连接都要重新设置。
- 还没
addOutput到 session 时,movieOutput 没有 video connection,setVideoStabilizationMode("...")返回false。所以先 addOutput,再设模式。 - 只有 mode 字符串拼错才会抛错。
videoStabilizationMode读出的是 active 而非 requested。当前 format 不支持时系统会静默降级或关掉。
