本讲是Android Camera专题系列的第18讲,我们介绍Android Camera2 API专题的Reprocessable Capture Session详解二。
更多资源:
资源 | 描述 |
---|---|
在线课程 | 极客笔记在线课程 |
知识星球 | 星球名称:深入浅出Android Camera 星球ID: 17296815 |
极客笔记圈 |
InputConfiguration简介
InputConfiguration用于创建Reprocessable capture session.
如何使用 InputConfiguration
- createReprocessableCaptureSession(InputConfiguration, List
outputs, callback, handler) -
createReprocessableCaptureSessionByConfigurations(InputConfiguration, List
outputs, callback, handler) -
createCaptureSession (SessionConfiguration config)
如何判断是否支持 Reprocessable
- Capabilities中必须一种Reprocessable capability,才能支持配置InputConfiguration
- PRIVATE_REPROCESSING
- YUV_REPROCESSING
如何获取支持的Size和Format
- StreamConfigurationMap#getinputformats
-
StreamConfigurationMap# getInputSizes
InputConfiguration APIs
API | Description | |
---|---|---|
InputConfiguration(int width, int height, int format) | 根据width,height和format创建InputConfiguration,这里的format必须来自StreamConfigurationMap#getinputsizes | API 23 |
InputConfiguration(Collection |
根据multiResolutionInputs和format创建InputConfiguration,这里的format必须来自MultiResolutionStreamConfigurationMap#getInputFormats(),表明从API 31开始Reprocessing也支持多分辨率输入 | API 31 |
getFormat() | 获取当前InputConfiguration的format | API 23 |
getHeight() | 获取当前InputConfiguration的height | API 23 |
getWidth() | 获取当前InputConfiguration的width | API 23 |
isMultiResolution() | 是否为多分辨率的InputConfiguration,多分辨率的InputConfiguration意味着从它创建的Reprocessable Camera Capture Session允许输入不同大小的图像。 | API 31 |
CameraDevice与Reprocessing相关的APIs
API | Description | API |
---|---|---|
createReprocessCaptureRequest(TotalCaptureResult inputResult) | 根据TotalCaptureResult创建用于处理Reprocessing的CaptureRequest.Builder,这里的TotalCaptureResult与Input image必须匹配,通常通过Timestamp进行匹配。 | API 23 |
createReprocessableCaptureSession (InputConfiguration inputConfig, List\ |
deprecated in API level 30.创建Reprocessable CaptureSession | API 23 |
createReprocessableCaptureSessionByConfigurations (InputConfiguration inputConfig, List\ |
deprecated in API level 30.创建Reprocessable CaptureSession | API 24 |
createCaptureSession(SessionConfiguration config) | 根据SessionConfiguration来创建Reprocessable CaptureSession | API 28 |
CameraCaptureSession与Reprocessing相关的APIs
API | Description | API |
---|---|---|
isReprocessable | 判断是否可以通过该CameraCaptureSession submit Reprocessable capture requests | API 23 |
getInputSurface | 获取Input Surface,注意这里只支持一个Input Surface,也没有必要支持多个Input Surfaces | API 23 |
ImageWriter简介
App通过ImageWriter可以向Surface送一块Buffer
ImageWriter queueInputImage Flow
方式一:直接将Image queue给ImageWriter
方式二:先dequeue一张Image,填好后再 queue给ImageWriter
ImageWriter APIs
API | Description | API |
---|---|---|
newInstance(Surface surface, int maxImages, int format) | 根据format和maxImages创建ImageWriter | API 23 |
newInstance(Surface surface, int maxImages) | 根据maxImages创建ImageWriter | API 23 |
setOnImageReleasedListener(ImageWriter.OnImageReleasedListener listener, Handler handler) | 注册OnImageReleasedListener,当Consumer将Image归还给ImageWriter时会调用 | |
dequeueInputImage() | 从ImageWriter中Dequeue一张Image来填 | API 23 |
getMaxImages() | 能从ImageWriter中dequeue出来的最大Image数量。dequeueInputImage的数量超出maxImages时会发生IllegalStateException. | API 23 |
queueInputImage(Image image) | 向ImageWriter Queue一张Image | API 23 |
getFormat() | 获取ImageWriter的Buffer Format。 | API 23 |
close() | 释放该ImageWriter的所有资源,close后再使用该ImageWriter会发生IllegalStateException | API 23 |
创建ImageWriter
newInstance(Surface surface, int maxImages)
- maxImages决定能从ImageWriter dequeue的最大Image数量,该值要设置适度,太大会占用更多内存
-
ImageWriter中的Image format和size由Surface决定
newInstance(Surface surface, int maxImages, int format)
- 这里指定的format会覆盖Surface中的format
-
比如Surface来自SurfaceTexture默认是PixelFormat#RGBA_8888,这里的format是ImageFormat#PRIVATE,则Surface会被覆盖为ImageFormat#PRIVATE
-
注意:如果Surface的format与输入format有冲突,请确保Consumer能吃下输入format
dequeueInputImage
从ImageWriter dequeue一张Image出来填写
填好后,通过queueInputImage(Image) 或 Image#close() 还给ImageWriter
无Image可用时(都在Consumer那边未Release),该方法会Block住
每当Consumer归还一张Buffer给ImageWriter时,OnImageReleasedListener#onImageReleased会被调用
ImageFormat#PRIVATE
- < Android P,这种format是不允许dequeueInputImage的,会发生IllegalStateException
-
>= Android P,这种format允许dequeueInputImage的,App可以通过Image#getHardwareBuffer访问
queueInputImage
向ImageWriter queue一张图
Image来源
- ImageReader
- Image 属性(size, format, strides, etc.) 必须跟ImageWriter dequeue出来的Image属性完全一致.
- 如果ImageWriter没有free的Image可用,该方法会被block住
- ImageWriter
- App负责向Image填数据
Timestamp
- Image中的timestamp需要Producer来填写
调用频率
- Producer可以收到OnImageReleasedListener#onImageReleased后才queue下一张Image
调用该方法后,输入Image就不能再使用了(可以看成调用了Image.close方法)