You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:23:38