2024年10月24日 第18讲 Reprocessable Capture Session详解二 极客笔记
本讲是Android Camera专题系列的第18讲,我们介绍Android Camera2 API专题的Reprocessable Capture Session详解二。
更多资源:
资源 | 描述 |
---|---|
在线课程 | 极客笔记在线课程 |
知识星球 | 星球名称:深入浅出Android Camera 星球ID: 17296815 |
极客笔记圈 |
InputConfiguration用于创建Reprocessable capture session.
如何使用 InputConfiguration
createReprocessableCaptureSessionByConfigurations(InputConfiguration, List
createCaptureSession (SessionConfiguration config)
如何判断是否支持 Reprocessable
如何获取支持的Size和Format
StreamConfigurationMap# getInputSizes
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 |
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 |
API | Description | API |
---|---|---|
isReprocessable | 判断是否可以通过该CameraCaptureSession submit Reprocessable capture requests | API 23 |
getInputSurface | 获取Input Surface,注意这里只支持一个Input Surface,也没有必要支持多个Input Surfaces | API 23 |
App通过ImageWriter可以向Surface送一块Buffer
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 |
newInstance(Surface surface, int maxImages)
ImageWriter中的Image format和size由Surface决定
newInstance(Surface surface, int maxImages, int format)
比如Surface来自SurfaceTexture默认是PixelFormat#RGBA_8888,这里的format是ImageFormat#PRIVATE,则Surface会被覆盖为ImageFormat#PRIVATE
注意:如果Surface的format与输入format有冲突,请确保Consumer能吃下输入format
从ImageWriter dequeue一张Image出来填写
填好后,通过queueInputImage(Image) 或 Image#close() 还给ImageWriter
无Image可用时(都在Consumer那边未Release),该方法会Block住
每当Consumer归还一张Buffer给ImageWriter时,OnImageReleasedListener#onImageReleased会被调用
ImageFormat#PRIVATE
>= Android P,这种format允许dequeueInputImage的,App可以通过Image#getHardwareBuffer访问
向ImageWriter queue一张图
Image来源
Timestamp
调用频率
调用该方法后,输入Image就不能再使用了(可以看成调用了Image.close方法)
本文链接:http://so.lmcjl.com/news/16128/