相关文章推荐

demo地址在 Github

Camera2 API使用步骤描述:

  1. 通过getSystemService()方法获取系统服务CameraManager

  2. 再通过系统服务CameraManager的openCamera方法打开设备
    在使用openCamera方法时需要传入CameraDevice.StateCallback接口,这个接口用来监听CameraDevice的状态。
    CameraDevice.StateCallback接口有三个主要方法需要实现:

    override fun onOpened(cameraDevice: CameraDevice)
    override fun onDisconnected(cameraDevice: CameraDevice)
    override fun onError(cameraDevice: CameraDevice, error: Int)
    

    重点在onOpen方法。onOpen方法中获取到CameraDevice对象不为空,则表示CameraDevice设备可以开始会话了。

  3. 在onOpened方法中 准备创建请求 ,通过CameraDevice.createCaptureRequest(templateType: Int)方法 获取到CaptureRequest.Builder对象,其中templateType参数有以下选项:

     CameraDevice.TEMPLATE_PREVIEW
     CameraDevice.TEMPLATE_RECORD
     CameraDevice.TEMPLATE_STILL_CAPTURE
     CameraDevice.TEMPLATE_VIDEO_SNAPSHOT
     CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG
     CameraDevice.TEMPLATE_MANUAL     
    

    预览使用 CameraDevice.TEMPLATE_PREVIEW
    视频录制 CameraDevice.TEMPLATE_RECORD
    拍照使用 CameraDevice.TEMPLATE_STILL_CAPTURE
    手动设置 CameraDevice.TEMPLATE_MANUAL

    传入不同的模版参数,系统会自动位CameraDevice设置部分参数,TEMPLATE_MANUAL表示全手动设置

  4. 在onOpened方法中创建会话, 通过CameraDevice.createCaptureSession创建会话,此方法需要传入CameraCaptureSession.StateCallback接口,此接口用来监听会话状态。
    CameraCaptureSession.StateCallback接口需要实现两个方法:

     override fun onConfigured(session: CameraCaptureSession?)
     override fun onConfigureFailed(session: CameraCaptureSession?)
    

    重点在onConfigured方法。onConfigured中的session参数不会空,则表示会话创建成功,可以开始发送请求。

  5. 在onConfigured方法中 创建请求 ,通过步骤3中的CaptureRequest.Builder对象的build()方法创建请求CameraRequest,最后通过CameraCaptureSession.setRepeatingRequest()方法发送请求

获取YUV_420_888数据

此出需要使用ImageReader。通过

ImageReader.newInstance(int width, int height, int format, int maxImages)

创建ImageReader对象,该方法的第三个参数format需要根据不同场景传入不同的值,如果需要YUV数据就传入google推荐的format参数

ImageFormat.YUV_420_888 

创建完成ImageReader后需要添加YUV帧数据回调,使用ImageReader.setOnImageAvailableListener方法,传入ImageReader.OnImageAvailableListener接口。此接口需要实现方法:

    void onImageAvailable(ImageReader reader)

在onImageAvailable方法中通过reader对象即可获取到YUV_420_888的byte数据,具体代码如下:

    val image = reader?.acquireNextImage()
    if (image != null) {
        val buffer = image.planes[0].buffer
        val data = ByteArray(buffer.remaining())
        buffer.get(data)
        Log.d(TAG, "data size = " + data.size + "; $threadName")
        image.close()

在步骤 3 使用CaptureRequest.Builder.addTarget(Surface outputTarget)方法添加设备的数据输出对象,此处有CaptureRequest.Builder.addTarget(ImageReader.surface)

在步骤 4 使用CameraDevice.createCaptureSession方法创建会话,该方法的第一个参数List outputs表示需要穿入设备的数据输出对象,同样需要将ImageReader.surface添加到outputs集合中

史上最强YUV转换RenderScript,支持转换为RGBA、BGRA,同时支持旋转和翻转。 YUV数据格式支持NV21、YV12、YUV420_888,对应Android Camera1APICamera2 APIYUV处理。 这段时间在做一些Android Camera数据处理相关的工作,涉及到YUV转RGBA。 由于对性能要求极高,我采用了多种解决方案。 起初,我尝试了OpenCV中的方法,终于找到了性能。 不是很理想。 最后使用了libyuv。 该库的性能优于 libyuv。 性能要求不是特别高。 你可以使用这个库。 这个库有一定的缺陷。 YUV转换后的图像还原度很差,有明显的色差,而且在运行时间长的安卓手机上,性能明显下降。 最后,没有办法开始使用 RenderScript。 我得谈谈谷歌。 他只提供了一个ScriptIntrinsicYuvToRGB,不支持YUV420_ android-Camera2Basic源码逻辑流程解析Android Camera2 相机预览、获取数据 Android Camera2采集摄像头原始数据并手动预览 googlesamples/android-Camer... 在Android平台开发实时音视频项目,摄像头的采集是一个必不可少的流程;通常在Android平台上采集摄像头数据可以使用Camera1接口、Camera2接口或者CameraX接口。Camera1接口只支持java语言的接口,是Android最开始支持的相机接口,在Android 5.0 以后逐步废弃;Camera2是替代Camera1的接口,不仅支持java语言的接口也支持c/c++的接口;CameraX 是一个 Jetpack 库,Camera2使用比较复杂,CameraX对Camera2的APIAndroid 5.0(21)之后,android.hardware.Camera被废弃(下面称为Camera1),还有一个android.graphics.Camera,这个android.graphics.Camera不是用来照相的,是用来处理图像的,可以做出3D的图像效果之类的,之前的Camera1则由android.hardware.Camera2来代替。 Camera2支持RAW输出,... Android camera2中yuv420 image转nv21数据教程:比较网上各种版本代码,说明他们的问题,并讲解原理。帮助大家避坑,彻底掌握yuv数据的转换 文章目录前言存储格式采样方式4:4:44:2:24:2:04:1:1映射点4:4:44:2:24:2:0格式别称YUVY 格式UYVY 格式YUV422P 格式YV12/YU12 格式NV12/NV21 格式内存大小  这篇文章主要是介绍车载前置摄像头(Front Camera)的输出信号的格式。YUV,是一种颜色编码方法。YUV是编译true-color颜色空间(color space)的种类,Y’UV, YUV, YCbCr,YPbPr等都可以称为YUV。Y 代表明亮度(Luminance或Lum 本文使用ffmepg将camera2中取出的YUV_420_888数据,编码生成mp4或ts文件。对于camera2,Android建议使用格式为YUV_420_888,数据分为3个plane,分别对应y,u,v分量。 具体如下: 1.涉及的参数配置: * 参数设置 typedef struct { int video_width;//1280 int video_height;//720 int video_frame_rate;//帧率:20fps 本讲是Android Camera专题系列的第21讲,我们介绍Android Camera2 API专题的createCaptureSession详解,包括如下五部分内容: createCaptureSession (SessionConfiguration config)注意事项 根据不同的场景选择Surface 流配置表说明 Regular流配置表 Reprocessing流配置表(参考:第17讲 Android Camera2 API Reprocessable Capture Sessio 在阅读本篇内容前、你需要首先了解 android 的 Binder IPC 通讯框架基本原理,才好更好理解 CameraServer 与CameraClient 之间通讯原理;此部分描述的是 android.hardware.Camera1 接口相机连接 CameraServer 的逻辑。... 获取图像原始数据 这些需求在官方给的一系列demo中都有示例,我也对Camera2Basic写过一篇笔记android-camera2basic源码逻辑流程解析 ,今天还是一个笔记,记录下第四个需求的问题。 首先,YUV420是一系列格式,从这个名字只能确定Y:U:V是4:1:1,具体的有YUV420P、YUV420SP、NV21、Y
 
推荐文章