# Camera2_HAL3 & device.start 流程分析 #
2023-05-07 04:59:52
理解 Android Camera2 API 的 Camera2_HAL3 和 Device.Start 流程
在移动摄影飞速发展的今天,Android Camera2 API 凭借其强大的功能脱颖而出。它赋予开发者对摄像头硬件的细致操控权,从而实现更精湛的拍照和录像效果。本文将深入剖析基于 Camera2_HAL3 和 device.start 的流程,帮助开发者掌握 Camera2 API 的工作原理。
初始化所有通道
开启 device.start() 方法之前,必须初始化所有通道。通道是 Camera2 API 中的数据结构,代表摄像头硬件中的数据流。例如,一个摄像头可以同时输出 YUV 数据流和 JPEG 数据流,因此需要使用两个不同的通道来表示它们。
通过调用 CameraManager.createChannel() 方法初始化通道,该方法接收两个参数:
- cameraId: 摄像头的 ID。
- streamConfiguration: StreamConfiguration 对象,指定通道的输出格式和分辨率。
调用 QCamera3Channel::start() 函数
初始化所有通道后,紧接着执行 QCamera3Channel::start() 函数:
status_t QCamera3Channel::start() {
Mutex::Autolock il(mLock);
if (mClosed || mStarted) {
ALOGE("%s: start failed, closed %d started %d", __func__,
mClosed, mStarted);
return ALREADY_EXISTS;
}
status_t res = createDestinationBufferQueue(mDestination);
if (res != OK) {
ALOGE("%s: createDestinationBufferQueue failed: %s (%d)", __func__,
strerror(-res), res);
return res;
}
mStarted = true;
mStreamState = QCamera3Channel::STREAMING;
return startImpl();
}
此函数启动通道,使其开始输出数据。
处理捕获请求和捕获结果
启动通道后,便可处理捕获请求和捕获结果。
捕获请求是应用程序发送给摄像头的指令,指示摄像头拍摄什么类型の写真或视频。捕获结果是摄像头对捕获请求的响应,其中包含所拍摄的照片或视频数据。
需要使用 CameraCaptureSession 对象处理捕获请求和捕获结果。CameraCaptureSession 对象可以同时处理多个捕获请求,并接收多个捕获结果。
通过 CameraDevice.createCaptureSession() 方法创建 CameraCaptureSession 对象,该方法需要两个参数:
- cameraDevice: 摄像头设备对象。
- outputTargets: OutputTarget 列表,指定捕获结果的输出目标。
示例代码
以下是如何使用 Camera2 API 进行拍照和录像的示例代码:
// 创建 CameraManager 对象
CameraManager cameraManager = (CameraManager)getSystemService(Context.CAMERA_SERVICE);
// 获取摄像头 ID
String cameraId = cameraManager.getCameraIdList()[0];
// 创建 CameraDevice 对象
CameraDevice cameraDevice = cameraManager.openCamera(cameraId, null, null);
// 创建 CameraCaptureSession 对象
CameraCaptureSession cameraCaptureSession = cameraDevice.createCaptureSession(outputTargets);
// 创建 CaptureRequest 对象
CaptureRequest.Builder captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
captureRequestBuilder.addTarget(outputTarget);
// 发送捕获请求
cameraCaptureSession.capture(captureRequestBuilder.build(), null, null);
常见问题解答
1. Camera2 API 与 Camera1 API 有什么区别?
Camera2 API 提供了对摄像头硬件的更精细控制,并且支持更多功能,例如 HDR、RAW 图像捕获和手动控制。
2. 如何使用 Camera2 API 进行实时预览?
可以通过创建输出目标为 SurfaceTexture 的捕获请求来实现实时预览。
3. 如何控制摄像头对焦?
可以通过在捕获请求中设置 ControlAE、ControlAF 和 ControlAWB 控制来控制摄像头对焦。
4. 如何获取 JPEG 格式的图像?
通过设置输出目标的格式为 ImageFormat.JPEG 即可获取 JPEG 格式的图像。
5. 如何优化 Camera2 API 的性能?
可以通过使用图像处理库、优化捕获请求和减少帧速率来优化 Camera2 API 的性能。
结论
本文深入分析了 Camera2_HAL3 和 device.start 流程,帮助开发者理解 Camera2 API 的工作原理。掌握这些知识至关重要,可以充分发挥 Camera2 API 的强大功能,开发出卓越的拍照和录像应用。