Android NDK开发详解相机之 Camera2 概览

Camera2 概览

注意:本页介绍的是 Camera2 软件包。除非您的应用需要 Camera2 的特定低层级功能,否则我们建议您使用 CameraX。CameraX 和 Camera2 都支持 Android 5.0(API 级别 21)及更高版本。

Camera2 是低级别 Android 相机软件包,替代了已废弃的 Camera 类。Camera2 可为复杂的用例提供深入控制功能,但要求您管理特定于设备的配置。 如需了解详情,请参阅 Camera2 参考文档。

The android.hardware.camera2 package provides an interface to individual camera devices connected to an Android device. It replaces the deprecated Camera class.

This package models a camera device as a pipeline, which takes in input requests for capturing a single frame, captures the single image per the request, and then outputs one capture result metadata packet, plus a set of output image buffers for the request. The requests are processed in-order, and multiple requests can be in flight at once. Since the camera device is a pipeline with multiple stages, having multiple requests in flight is required to maintain full framerate on most Android devices.

To enumerate, query, and open available camera devices, obtain a CameraManager instance.

Individual CameraDevices provide a set of static property information that describes the hardware device and the available settings and output parameters for the device. This information is provided through the CameraCharacteristics object, and is available through getCameraCharacteristics(String)

To capture or stream images from a camera device, the application must first create a camera capture session with a set of output Surfaces for use with the camera device, with createCaptureSession(SessionConfiguration). Each Surface has to be pre-configured with an appropriate size and format (if applicable) to match the sizes and formats available from the camera device. A target Surface can be obtained from a variety of classes, including SurfaceView, SurfaceTexture via Surface(SurfaceTexture), MediaCodec, MediaRecorder, Allocation, and ImageReader.

Generally, camera preview images are sent to SurfaceView or TextureView (via its SurfaceTexture). Capture of JPEG images or RAW buffers for DngCreator can be done with ImageReader with the JPEG and RAW_SENSOR formats. Application-driven processing of camera data in RenderScript, OpenGL ES, or directly in managed or native code is best done through Allocation with a YUV Type, SurfaceTexture, and ImageReader with a YUV_420_888 format, respectively.

The application then needs to construct a CaptureRequest, which defines all the capture parameters needed by a camera device to capture a single image. The request also lists which of the configured output Surfaces should be used as targets for this capture. The CameraDevice has a factory method for creating a request builder for a given use case, which is optimized for the Android device the application is running on.

Once the request has been set up, it can be handed to the active capture session either for a one-shot capture or for an endlessly repeating use. Both methods also have a variant that accepts a list of requests to use as a burst capture / repeating burst. Repeating requests have a lower priority than captures, so a request submitted through capture() while there’s a repeating request configured will be captured before any new instances of the currently repeating (burst) capture will begin capture.

After processing a request, the camera device will produce a TotalCaptureResult object, which contains information about the state of the camera device at time of capture, and the final settings used. These may vary somewhat from the request, if rounding or resolving contradictory parameters was necessary. The camera device will also send a frame of image data into each of the output Surfaces included in the request. These are produced asynchronously relative to the output CaptureResult, sometimes substantially later.

对于大多数开发者,我们建议使用 CameraX Jetpack 库。为了帮助您确定要使用的相机库,请参阅选择相机库。

其他资源

如需详细了解 Camera2,请参阅下面列出的其他资源。

Camera2 示例项目

Camera2 基础知识

在这里插入图片描述

Camera2 扩展

在这里插入图片描述

Camera2 慢动作

在这里插入图片描述

“Camera2”视频

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在使用 Android NDK Camera 开发时,可以通过调用 Camera.Parameters 的 setExposureCompensation(int) 方法来关闭曝光控制。具体实现代码如下: ``` #include <android/native_window_jni.h> #include <android/native_window.h> #include <android/log.h> #include <android/bitmap.h> #include <jni.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <time.h> #include <math.h> #include <pthread.h> #include <unistd.h> #include <fcntl.h> #include <sys/mman.h> #include <sys/ioctl.h> #include <linux/videodev2.h> #define LOG_TAG "NDKCamera" #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) extern "C" { JNIEXPORT void JNICALL Java_com_example_ndkcamera_CameraActivity_setExposureCompensation(JNIEnv* env, jobject obj, jint value); }; void Java_com_example_ndkcamera_CameraActivity_setExposureCompensation(JNIEnv* env, jobject obj, jint value) { jclass cameraClass = env->FindClass("android/hardware/Camera"); jmethodID openMethodID = env->GetStaticMethodID(cameraClass, "open", "(I)Landroid/hardware/Camera;"); jobject cameraObject = env->CallStaticObjectMethod(cameraClass, openMethodID, 0); jmethodID getParametersMethodID = env->GetMethodID(cameraClass, "getParameters", "()Landroid/hardware/Camera$Parameters;"); jobject parametersObject = env->CallObjectMethod(cameraObject, getParametersMethodID); jclass parametersClass = env->FindClass("android/hardware/Camera$Parameters"); jmethodID setExposureCompensationMethodID = env->GetMethodID(parametersClass, "setExposureCompensation", "(I)V"); env->CallVoidMethod(parametersObject, setExposureCompensationMethodID, value); jmethodID setParametersMethodID = env->GetMethodID(cameraClass, "setParameters", "(Landroid/hardware/Camera$Parameters;)V"); env->CallVoidMethod(cameraObject, setParametersMethodID, parametersObject); } ``` 以上代码中,我们通过调用 setExposureCompensation(int) 方法,将曝光补偿值设置为 0,来关闭曝光控制。具体实现中,我们使用了 JNI(Java Native Interface)来将 Java 代码与 C++ 代码连接起来。 在 Java 代码中,我们可以像下面这样调用 C++ 函数来关闭曝光控制: ``` setExposureCompensation(0); ``` 注意,这里的参数值为 0,表示关闭曝光控制。如果需要开启曝光控制,可以将参数值设置为一个正整数,表示曝光补偿值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五一编程

程序之路有我与你同行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值