1.3Camera2 Session机制详解及Camera1的对比

12 篇文章 23 订阅

想要理解API2的Session机制,不能简单的只从Camera看,而是要结和Sesion本身的概念来看。

一、Session机制

1、Web应用中的Session

计算机领域的Session概念主要来自于Web通信,在网络应用中,称为会话控制。

“Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web页时,如果该用户还没有会话,则Web服务器将自动创建一个 Session对象。当会话过期或被放弃后,服务器将终止该会话。”

以上描述来自百度百科。我们通过这段描述,可以看出Session的几个特点

  1. Session由服务器创建,由服务器终止,期间始终存在,除非过期或被放弃;
  2. Sesion存储的变量始终不会丢失;

2、Caemra API2中的Session

如前所述,我们已经知道了Web应用中Session的几个特点,现在我们来对比一下Camera2下的Session概念是否也具有类似的特征。

1.如上一节介绍CameraDevice的主要作用就是创建Session;在session中存在一个closeByDevice()方法,这个方法会在device创建session调用关闭已存在会话;会在error时调用;以及在device关闭调用disconnected时调用。

也就是说Session的创建和销毁完全由device管理。

2.Camera2的Request全部由Session下发,除非修改,否则将始终保持之前的状态。

从上面的分析可以看到,Camera2的Session与Web应用的Session行为上是一致的。所以,我们可以理解Caemra 2的Session具备了Web应用Session的优点。

3、Camera1与Camera2的区别

二者除了API接口本身的区别,最大的区别还是在实现逻辑上的。

Camera1的逻辑是面向Camera对象的,所有的行为都是基于这个对象的方法的,如果这个对象本身就存在问题是无法感知的,只能在调用方法时抛出异常;

Camera2的逻辑则是面向状态的,无论device还是session,任何状态的改变可以做出相应的处理。

正是这样的逻辑不同,导致了MetaData在传递上的区别。

Camera1的Parameter根据TAG直接绑定MetaData Request,经过Capture_Request转为camera3_capture_request中的camera_metadata_t settings完成参数从Java到native到HAL3的传递。

Camera2则直接封装为CaputureRequest,统一了Framework和HAL层的数据,没有复杂的数据转换过程。

二、Session传递的属性

在1.2节中我们介绍Preview时,我们提到了session创建连续捕获的方法setRepeatingRequest(),其中第一个参数是一个CaptureRequest对象,这个类采用了创建者模式,即request对象需要由builder创建

Kotlin代码:

mPreviewRequest = mPreviewRequestBuilder!!.build()

CaptureRequest类中只提供了一些get方法和比较方法,真正的功能性方法set是在builder中,所以为了让相机达到我们想要的效果,我们需要对builder进行操作。

Kotlin代码:

mPreviewRequest = mPreviewRequestBuilder!!.build()

CaptureRequest类中只提供了一些get方法和比较方法,真正的功能性方法set是在builder中,所以为了让相机达到我们想要的效果,我们需要对builder进行操作。

Kotlin代码:

//构建Request Builder

mPreviewRequestBuilder = mCameraDevice!!.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW)

//设置自动对焦

mPreviewRequestBuilder!!.set(CaptureRequest.CONTROL_AF_MODE,CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE)

 

这里我们以设置自动对焦的连续对焦模式为例,可以看到对于Metadata而言就是设置key-value键值对即可。

最后将构建好的builder赋值到Request

Kotlin代码:

mPreviewRequest = mPreviewRequestBuilder!!.build()

这样Request对象就已经完成了初始化和设置参数,通过session就可以下发到HAL层了。

在这里我们需要注意到CaptureRequest类、CaptureResult类都是继承自CameraMetadata<CaptureResult.Key<?>>类,也就是说所有可设置的参数,实际上都是在Metadata的设置范围内进行的。

下一章节,我们将详细讲解CameraMetadata<TKey>类。

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我之前的回答中提到的 `SessionConfiguration` 是与自然语言处理相关的,与 Android 相机开发无关。如果您要在 Android Camera2 中创建会话(Session),可以使用 `CameraCaptureSession` 类。下面是一个示例代码片段,用于创建一个 `CameraCaptureSession` 对象: ```java private CameraCaptureSession mCameraCaptureSession; private void createCameraSession() { try { Surface surface = mPreviewSurface; mImageReader = ImageReader.newInstance(mPreviewSize.getWidth(), mPreviewSize.getHeight(), ImageFormat.JPEG, 1); mImageReader.setOnImageAvailableListener(mOnImageAvailableListener, mBackgroundHandler); List<Surface> outputSurfaces = new ArrayList<>(); outputSurfaces.add(surface); outputSurfaces.add(mImageReader.getSurface()); mCameraDevice.createCaptureSession(outputSurfaces, mStateCallback, mBackgroundHandler); } catch (CameraAccessException e) { e.printStackTrace(); } } private CameraCaptureSession.StateCallback mStateCallback = new CameraCaptureSession.StateCallback() { @Override public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) { mCameraCaptureSession = cameraCaptureSession; try { mCameraCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), null, mBackgroundHandler); } catch (CameraAccessException e) { e.printStackTrace(); } } @Override public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) { Log.e(TAG, "onConfigureFailed: CameraCaptureSession configuration failed"); } }; ``` 在上面的代码中,我们使用 `CameraDevice` 的 `createCaptureSession()` 方法来创建一个会话。我们在 `createCaptureSession()` 方法中指定了要输出的 `Surface` 列表,包括预览 `Surface` 和图像读取器 `Surface`。在 `onConfigured()` 方法中,我们将创建的 `CameraCaptureSession` 对象保存在变量 `mCameraCaptureSession` 中,并将预览请求设置为重复请求,这样就可以实时预览相机输出了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值