android camera参数

99ANYc3cd6
预计阅读时长 26 分钟
位置: 首页 参数 正文

Android 相机参数的获取和设置主要通过 Camera API(旧版)和 Camera2 API(新版,强烈推荐)来完成,下面我将围绕这两个 API,并结合具体参数进行讲解。

android camera参数
(图片来源网络,侵删)

核心概念:参数的层次结构

在深入具体参数之前,你需要理解 Android 相机参数的组织方式,它通常是一个分层的结构:

  1. 设备:代表物理相机硬件(如后置主摄、前置广角、后置长焦等)。
  2. 会话CameraCaptureSession,管理与相机的连接,用于发送请求和接收结果。
  3. 请求CaptureRequest,这是最重要的部分,它包含了“在某一时刻,你希望相机做什么”的所有参数,对焦模式、曝光模式、拍照还是录像、是否开启闪光灯等。
  4. 配置CameraCharacteristics,代表相机硬件的“静态能力”,这些是相机本身固有的属性,你不能改变它们,只能查询,支持哪些分辨率、支持哪些对焦模式、传感器尺寸是多少等。

简单比喻:

  • CameraCharacteristics 就像一辆汽车的《说明书》,告诉你这辆车有哪些功能(比如最高时速、有几个档位、有没有ESP)。
  • CaptureRequest 就像你踩下油门、转动方向盘、挂上档位的动作,你告诉车在当前状态下要怎么做。
  • CameraCaptureSession 就像你和汽车之间的通信协议,确保你的动作被正确执行。

核心参数详解

我们将参数分为两大类:静态能力动态请求

A. 静态能力 - CameraCharacteristics

这些参数通过 CameraCharacteristics.get(key) 获取,用于了解相机的能力。

android camera参数
(图片来源网络,侵删)
参数 Key 说明 常用值/类型 用途
LENS_FACING 相机朝向 LENS_FACING_BACK, LENS_FACING_FRONT 区分前置、后置、外置相机。
SENSOR_INFO_PIXEL_ARRAY_SIZE 传感器分辨率 Size(width, height) 获取相机传感器的原始分辨率,是计算其他预览/拍照尺寸的基础。
SCALER_AVAILABLE_STREAM_CONFIGURATIONS 支持的输出流配置 StreamConfigurationMap 非常重要! 获取所有支持的输出格式(如 ImageFormat.YUV_420_888, ImageFormat.JPEG)和对应的分辨率(Size数组),用于设置预览尺寸、拍照尺寸等。
CONTROL_AF_AVAILABLE_MODES 支持的对焦模式 int[] 数组,如 [CONTROL_AF_MODE_AUTO, CONTROL_AF_MODE_CONTINUOUS_PICTURE] 查询相机支持哪些对焦方式。
CONTROL_AE_AVAILABLE_MODES 支持的曝光模式 int[] 数组,如 [CONTROL_AE_MODE_ON_AUTO_FLASH, CONTROL_AE_MODE_OFF] 查询相机支持哪些曝光方式。
FLASH_INFO_AVAILABLE 是否支持闪光灯 boolean 判断设备是否有闪光灯。
LENS_INFO_AVAILABLE_FOCAL_LENGTHS 可用焦距 float[] 获取镜头的焦距信息,可用于计算视场角。
STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES 支持的人脸检测模式 int[] 查询是否支持以及支持哪种级别的人脸检测。
CONTROL_AVAILABLE_EFFECTS 支持的拍照特效 int[],如 [EFFECT_NONE, EFFECT_MONO, EFFECT_NEGATIVE] 查询可用的艺术滤镜。

B. 动态请求 - CaptureRequest

这些参数设置在 CaptureRequest.Builder 中,用于控制相机在某一帧的行为。

参数 Key 说明 常用值/类型 用途
CONTROL_AF_MODE 对焦模式 CONTROL_AF_MODE_OFF (手动)
CONTROL_AF_MODE_AUTO (自动对焦,触发一次)
CONTROL_AF_MODE_CONTINUOUS_PICTURE (连续对焦,适合拍照)
CONTROL_AF_MODE_CONTINUOUS_VIDEO (连续对焦,适合视频)
拍照时通常用 CONTINUOUS_PICTUREAUTO,视频时用 CONTINUOUS_VIDEO
CONTROL_AF_TRIGGER 对焦触发 CONTROL_AF_TRIGGER_START (开始对焦)
CONTROL_AF_TRIGGER_CANCEL (取消对焦)
CONTROL_AF_MODE 设置为 AUTO 时,需要发送 START 来触发一次对焦,对焦完成后,会通过 CameraCaptureSession.CaptureCallback 通知你。
CONTROL_AE_MODE 曝光模式 CONTROL_AE_MODE_ON_AUTO_FLASH (自动闪光)
CONTROL_AE_MODE_ON_ALWAYS_FLASH (强制闪光)
CONTROL_AE_MODE_OFF (关闭自动曝光,需手动设置曝光补偿)
控制是否启用自动曝光和闪光灯。
CONTROL_AE_EXPOSURE_COMPENSATION 曝光补偿 int 值,范围由 CameraCharacteristics 决定 调整画面的明暗,正值变亮,负值变暗。
CONTROL_AE_PRECAPTURE_TRIGGER 拍照触发(测光) CONTROL_AE_PRECAPTURE_TRIGGER_START 在拍照前发送此请求,让相机进行测光、对焦、白平衡等准备工作,以确保最佳成像质量。
CONTROL_AE_LOCK 曝光锁定 true / false 锁定当前曝光值,之后即使场景变化,亮度也不会变。
CONTROL_AWB_MODE 白平衡模式 CONTROL_AWB_MODE_AUTO (自动)
CONTROL_AWB_MODE_CLOUDY_DAYLIGHT (阴天)
CONTROL_AWB_MODE_TUNGSTEN (白炽灯)
控制画面的色彩还原。
FLASH_MODE 闪光灯模式 FLASH_MODE_OFF (关闭)
FLASH_MODE_SINGLE (自动/闪光一次)
FLASH_MODE_TORCH (手电筒模式,常亮)
单独控制闪光灯,注意与 CONTROL_AE_MODE 的联动。
CONTROL_EFFECT_MODE 特效模式 EFFECT_NONE, EFFECT_MONO, EFFECT_SEPIA 应用黑白、复古等滤镜效果。
CONTROL_ZOOM_RATIO 数码变焦 float 值 (1.0 为原始) 实现数码变焦,注意变焦会降低画质。
JPEG_ORIENTATION JPEG图片方向 int (0, 90, 180, 270) 非常重要! 拍照的JPEG图片需要根据设备方向进行旋转,才能在相册中正确显示,需要结合设备方向和相机传感器方向计算。
SENSOR_ORIENTATION 传感器方向 int (0, 90, 270) 相机传感器的物理方向,用于计算正确的图片旋转角度。
STATISTICS_FACE_DETECT_MODE 人脸检测模式 STATISTICS_FACE_DETECT_MODE_FULL 启用人脸检测功能。

代码示例 (Camera2 API)

下面是一个使用 Camera2 API 设置核心参数的简化示例。

获取静态能力

// 在相机打开后,获取 CameraCharacteristics
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
String cameraId = manager.getCameraIdList()[0]; // 假设使用后置摄像头
CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
// 查询支持的对焦模式
int[] afModes = characteristics.get(CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES);
if (Arrays.asList(afModes).contains(CameraCharacteristics.CONTROL_AF_MODE_CONTINUOUS_PICTURE)) {
    // 支持连续对焦模式,适合拍照
}
// 查询支持的预览尺寸
StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_AVAILABLE_STREAM_CONFIGURATIONS);
Size[] previewSizes = map.getOutputSizes(SurfaceTexture.class);
// 从 previewSizes 中选择一个合适的尺寸...

创建动态请求

// 创建 CaptureRequest.Builder
// 第一个参数是目标 Surface,第二个参数是模板类型(预览、拍照等)
CaptureRequest.Builder previewRequestBuilder =
        cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
// 1. 设置目标 Surface (预览画面将显示在这个 Surface 上)
previewRequestBuilder.addTarget(surface);
// 2. 设置对焦模式
previewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
        CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
// 3. 设置曝光模式 (自动闪光)
previewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,
        CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
// 4. 设置白平衡模式
previewRequestBuilder.set(CaptureRequest.CONTROL_AWB_MODE,
        CaptureRequest.CONTROL_AWB_MODE_AUTO);
// 5. 如果需要锁定对焦或曝光
// previewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_START);
// previewRequestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, true);
// 6. 构建最终的 CaptureRequest
CaptureRequest previewRequest = previewRequestBuilder.build();
// 7. 将请求发送到 CameraCaptureSession
cameraCaptureSession.setRepeatingRequest(previewRequest, null, null);

拍照时的特殊请求

拍照通常需要两步:测光捕获

// 第一步:发送测光请求
CaptureRequest.Builder stillCaptureBuilder =
        cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
// ... 设置和预览请求相同的参数 (对焦、曝光等)
// 发送预捕获触发,让相机进行准备工作
stillCaptureBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,
        CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START);
// 第二步:在收到测光完成的回调后,发送拍照请求
// 在 CameraCaptureSession.CaptureCallback 的 onCaptureProgressed 中
// 检查 CaptureResult.CONTROL_AE_STATE 是否为 CONTROL_AE_STATE_CONVERGED
// 如果已收敛,则执行拍照
// 创建拍照请求
stillCaptureBuilder.addTarget(imageReader.getSurface());
// ... 可以在这里设置 JPEG 方向
// int rotation = getWindowManager().getDefaultDisplay().getRotation();
// stillCaptureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getCorrectOrientation(rotation, characteristics));
CaptureRequest captureRequest = stillCaptureBuilder.build();
cameraCaptureSession.capture(captureRequest, captureCallback, backgroundHandler);

重要注意事项

  1. API 版本

    android camera参数
    (图片来源网络,侵删)
    • Camera (1.0) API:已废弃,仅用于维护旧项目。
    • Camera2 (API 21+):现代 Android 开发的唯一选择,功能强大,但使用复杂,Google 提供了 CameraX 库来简化 Camera2 API 的使用。
  2. 性能

    • Camera2 是异步的,所有操作(打开相机、设置参数、拍照)都必须通过回调函数处理。
    • 频繁地设置 CaptureRequest 参数(尤其是在预览时)可能会影响性能,一旦设置好预览参数,就使用 setRepeatingRequest 来持续渲染预览画面。
  3. 权限

    • 从 Android 6.0 (API 23) 开始,相机访问需要运行时权限 Manifest.permission.CAMERA
    • 如果你的 App 录音,还需要 Manifest.permission.RECORD_AUDIO
  4. 线程

    • 所有与相机相关的回调(CameraDevice.StateCallback, CameraCaptureSession.CaptureCallback)都会在后台线程执行,不要在这些回调中进行耗时操作(如 UI 更新),应使用 Handler 将任务切换到主线程。

掌握 Android 相机参数,关键在于理解 CameraCharacteristics(能力)和 CaptureRequest(指令)的区别,通过查询 Characteristics 来了解相机能做什么,然后通过构建 Request 来告诉相机具体怎么做,在实践中,多查阅官方文档,并结合代码进行调试,是掌握这些参数的最佳途径。

-- 展开阅读全文 --
头像
宏基e5 471 series拆机步骤复杂吗?
« 上一篇 01-14
thinkpad t460拆机手册
下一篇 » 01-14
取消
微信二维码
支付宝二维码

最近发表

标签列表

目录[+]