简述Camera2 Capture数据流的流程
创始人
2025-05-29 11:33:29
0

概述

我们调用Camera2的api去使用相机的过程大概可以简述如下:

1、创建并确定一块SurfaceTexture用来预览数据

2、获取CameraManager服务并通过Characteristic去设置相机参数

3、使用CameraManager去openCamera并设置CameraDevice.StateCallback回调接口,这个回调接口会返回我们open的cameraDevice,获取到CameraDevice就获得了相机的控制权。

4、通过返回的cameraDevcie去创建session, mCameraDevice.createCaptureSession,这里可以传入两个参数,一个是我们的Surface作为消费者,比如预览拍照的Surface(Arrays.asList(mPreviewSurface, mImageReader.getSurface())),可以作为列表传入多个Surface,这里就已经开始创建Stream数据流了。另一个参数是 new CameraCaptureSession.StateCallback(),数据会话的回调,此回调监听配置是否完成以及数据流是否创建完成。并且返回CameraCaptureSession的实例。

5、收到数据配置完成的回调以后如果想要循环接收数据还要通过CameraCaptureSession来设置数据流, cameraCaptureSession.setRepeatingRequest(
                                            mPreviewRequestBuilder.build(),
                                            mPreCaptureCallback, mBackgroundHandler);

这里我们mPreviewRequestBuilder为CaptureRequest的实例,他包含了Surface的一些信息。这里的Surface需要跟createCaptureSession里传入的Surface列表对应。

Surface的追踪

当我们createCaptureSession的时候会传入Surface的list,当我们创建这些Surface的时候他们的format会被指定,如果没有指定那么将使用默认,当需要实现拍照,我们在创建ImageReader的时候可以直接指定Format,例如ImageReader.newInstance(largestRaw.getWidth(),
                                        largestRaw.getHeight(), ImageFormat.RAW_SENSOR, /*maxImages*/ 5));

这里直接给一个RAW_SENSOR的格式,当然我们还可以指定JPEG等,这里的模式非常重要,因为下一步会影响到我们底层创建stream的时候数据流。

CameraDeviceImpl.java里configureStreamsChecked的时候会循环创建不同的数据流,最终会来到 Camera3Device::createStream创建每一路数据流,这里会根据Surface的format来创建不同数据流。

Surface的变形过程

Surface被配置到ArryList传送到createCaptureSession函数中,第一步在 outConfigurations.add(new OutputConfiguration(surface));中加入到outConfigurations中,OutputConfiguration用来管理图像的角度,colorspace,格式等信息,让后会把这个outConfigurations送入到native去创建数据流 mRemoteDevice.createStream(outputConfiguration)

然后在CameraDeviceClient.cpp中会将outConfigurations中的Surface取出并做变形onst std::vector>& bufferProducers =
            outputConfiguration.getGraphicBufferProducers();

直接取出IGraphicBufferProducer,然后创建自己的Surface

for (auto& bufferProducer : bufferProducers)

  sp surface;
        res = createSurfaceFromGbp(streamInfo, isStreamInfoValid, surface, bufferProducer);

然后再去用Camera3Device.cpp创建Stream, err = mDevice->createStream(surfaces, deferredConsumer, streamInfo.width,
            streamInfo.height, streamInfo.format, streamInfo.dataSpace,
            static_cast(outputConfiguration.getRotation()),
            &streamId, physicalCameraId, &surfaceIds, outputConfiguration.getSurfaceSetID(),
            isShared);

此时Surfaces转变了身份作为消费者存在了, Camera3Device::createStream(const std::vector>& consumers, .......

 newStream = new Camera3OutputStream(mNextStreamId, consumers[0],
                width, height, blobBufferSize, format, dataSpace, rotation,
                mTimestampOffset, physicalCameraId, streamSetId);

当我们CreateCaptureSession的时候还没有激活数据流,第一次会在我们下一步setRepeatRequest的时候去激活。

上一篇:NGINX配置SSL支持

下一篇:C#编程概述

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...