iOS15与iOS16下iPhone11超广角相机拍摄裁切差异及解决方案问询
iOS15/iOS16超广角相机视频录制裁切差异解决方案
关于iOS16是否强制启用ISP级EIS的问题
iOS16并没有强制ISP启用EIS,你遇到的裁切是系统默认的数字裁切策略,而非EIS本身生效——即使设置preferredVideoStabilizationMode = .off,iOS16仍会对部分超广角视频格式自动应用裁切来优化画面表现。
实现iOS15/iOS16统一无裁切录制的代码方案
1. 筛选原生无裁切的相机格式
iPhone11的超广角相机存在多个视频格式,部分格式默认绑定了数字裁切逻辑。需筛选出不支持视频稳定且对应目标分辨率的原生格式:
guard let ultraWideDevice = AVCaptureDevice.default(.builtInUltraWideCamera, for: .video, position: .back) else { fatalError("超广角相机不可用") } // 筛选1080p/30fps、无视频稳定支持的原生格式 let targetFormats = ultraWideDevice.formats.filter { format in let formatDesc = format.formatDescription let dimensions = CMVideoFormatDescriptionGetDimensions(formatDesc) let supportsStabilization = format.isVideoStabilizationSupported let supports30fps = format.videoSupportedFrameRateRanges.contains { range in range.minFrameRate <= 30 && range.maxFrameRate >= 30 } return !supportsStabilization && dimensions.width == 1920 && dimensions.height == 1080 && supports30fps } // 应用筛选后的格式 if let selectedFormat = targetFormats.first { do { try ultraWideDevice.lockForConfiguration() ultraWideDevice.activeFormat = selectedFormat ultraWideDevice.unlockForConfiguration() } catch { print("相机格式配置失败: \(error.localizedDescription)") } }
2. 彻底关闭视频稳定相关的自动调整
除了设置稳定模式为.off,还需禁用系统的自动稳定调整:
if let videoConnection = captureSession.connections.first(where: { $0.isVideoOrientationSupported }) { if videoConnection.isVideoStabilizationSupported { videoConnection.automaticallyAdjustsVideoStabilizationEnabled = false videoConnection.preferredVideoStabilizationMode = .off } }
3. 验证视野范围
设置完成后,可通过ultraWideDevice.activeFormat.videoFieldOfView验证视野角度——iPhone11超广角原生FOV约为120度,若数值接近则说明已启用无裁切格式。
补充说明
iOS16对相机编码管线做了优化,部分支持EIS的格式即使关闭稳定模式,系统仍会保留轻微裁切逻辑。因此必须严格选择不支持任何视频稳定模式的格式,才能确保在iOS15和iOS16下都获得原生无裁切的录制效果。
内容的提问来源于stack exchange,提问作者chamcham
相关产品推荐
相关产品推荐

