iOS Swift 4:无需遍历格式直接设置后置1080p摄像头60 FPS
无需遍历摄像头格式即可设置1080p@60fps的方法
嘿,这个问题我太熟了——遍历所有摄像头格式确实又慢又容易踩崩溃坑,尤其是在硬件参差不齐的移动设备上。其实完全不用全遍历,有几个更高效的思路:
核心思路:锁定目标分辨率,精准查询帧率
不用枚举所有支持的格式,直接锁定你需要的1080p(1920×1080)尺寸,只针对该尺寸查询对应的帧率范围,这比全遍历快很多,还能避免遍历过程中可能出现的空指针或格式兼容问题。
安卓(Camera2 API)示例代码
// 获取摄像头特性 CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); String backCameraId = null; // 快速获取后置摄像头ID(简化处理,实际可加更严谨的判断) for (String id : cameraManager.getCameraIdList()) { CameraCharacteristics chars = cameraManager.getCameraCharacteristics(id); Integer facing = chars.get(CameraCharacteristics.LENS_FACING); if (facing != null && facing == CameraCharacteristics.LENS_FACING_BACK) { backCameraId = id; break; } } if (backCameraId != null) { CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(backCameraId); StreamConfigurationMap configMap = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); // 直接指定目标1080p尺寸 Size targetSize = new Size(1920, 1080); // 仅查询该尺寸支持的高速帧率范围 Range<Integer>[] fpsRanges = configMap.getHighSpeedVideoFpsRangesFor(targetSize); if (fpsRanges != null) { // 找到支持60fps的范围并设置 for (Range<Integer> range : fpsRanges) { if (range.getLower() <= 60 && range.getUpper() >= 60) { // 在CaptureRequest.Builder中设置帧率 captureRequestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, new Range<>(60, 60)); break; } } } }
iOS(AVFoundation)示例代码
guard let backCamera = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back) else { print("后置摄像头不可用") return } let targetSize = CGSize(width: 1920, height: 1080) // 仅筛选目标尺寸且支持60fps的格式,不用全遍历 guard let desiredFormat = backCamera.formats.first(where: { format in let dimensions = CMVideoFormatDescriptionGetDimensions(format.formatDescription) let formatSize = CGSize(width: dimensions.width, height: dimensions.height) guard let fpsRange = format.videoSupportedFrameRateRanges.first else { return false } return formatSize == targetSize && fpsRange.maxFrameRate >= 60 }) else { print("设备不支持1080p@60fps") return } // 设置格式和帧率 do { try backCamera.lockForConfiguration() backCamera.activeFormat = desiredFormat backCamera.activeVideoMinFrameDuration = CMTimeMake(value: 1, timescale: 60) backCamera.activeVideoMaxFrameDuration = CMTimeMake(value: 1, timescale: 60) backCamera.unlockForConfiguration() } catch { print("设置摄像头参数失败:\(error)") }
更省心的方案:用官方高阶框架
如果项目允许,直接用官方封装的高阶API,比如安卓的CameraX或者iOS的AVCaptureSession预设,这些框架已经帮你处理了所有底层格式校验和筛选逻辑,你只需要几行代码就能设置目标分辨率和帧率:
安卓CameraX示例
val preview = Preview.Builder() .setTargetResolution(Size(1920, 1080)) .setTargetFpsRange(60, 60) .build()
关键注意事项
- 兼容性检查不可少:不是所有设备都支持1080p@60fps,一定要加异常捕获或判断逻辑,避免设置失败导致崩溃。
- 优先用平台原生方法:比如Camera2的
getHighSpeedVideoFpsRangesFor(),这些方法是官方优化过的,比自己遍历更稳定高效。
内容的提问来源于stack exchange,提问作者Tony Merritt
相关产品推荐
相关产品推荐

