Android Camera2基础API

Android Camera2基础API,android,android-camera,Android,Android Camera,我正在这里阅读有关Android Camera2 API的代码: 这句话令人困惑: previewRequest builder仅将要显示的TextureView表面添加为目标。但下面这行实际上将两者都添加为目标。据我所知,这不应该在预览期间触发“OnImageAvailable”Lisenter,不是吗?那么为什么要在这里添加imagereader的曲面呢 我试图删除这个imagereader的表面,但当我真的想捕获图像时出现了错误 太令人困惑了 您需要声明在创建CameraCapture

我正在这里阅读有关Android Camera2 API的代码:

这句话令人困惑:

previewRequest builder仅将要显示的TextureView表面添加为目标。但下面这行实际上将两者都添加为目标。据我所知,这不应该在预览期间触发“OnImageAvailable”Lisenter,不是吗?那么为什么要在这里添加imagereader的曲面呢

我试图删除这个imagereader的表面,但当我真的想捕获图像时出现了错误


太令人困惑了

您需要声明在创建
CameraCaptureSession
时图像数据可能发送到的所有输出
Surface
。这就是框架的设计方式

每当您创建一个
CaptureRequest
,您都会添加一个(列表)目标输出
Surface
。这是来自捕获帧的图像数据的去向-它可能是与用于显示的
纹理视图相关联的
表面,或与用于保存的
图像读取器相关联的
表面,或与用于处理的
分配相关联的
。(一个
表面
实际上只是一个缓冲区,它可以接收摄像机输出的数据。缓冲区关联的对象类型决定了你如何访问/处理数据。)


您不必将每个帧的数据发送到所有已注册的
Surface
s,但必须将数据发送到其中的一个子集。如果
Surface
在创建时未注册到
CameraCaptureSession
,则无法将其添加为
CaptureRequest
的目标。当然,您可以,但可以将其传递给会话会导致崩溃,所以请不要这样做。

ImageReader
用于获取捕获的图像数据以保存到文件中。据Hi Sumner介绍,在使用
CaptureRequest.Builder
捕获图像之前,必须将
ImageReader
的表面添加到
CaptureSession
,谢谢您的解释。据我所知,这里有两个不同的捕获会话,一个用于预览,另一个用于真实捕获。我感到困惑,因为我应该只将图像读取器的曲面注册到真实捕获会话,没有?CameraCaptureSessions很大,成本很高,而且很少创建。通常,您可以决定出于各种目的发送到哪个输出曲面(显示、保存等),然后创建一个单独的会话,每个会话都注册到该会话,以便您可以随时通过向该部分发出CaptureRequests来使用它们。您应该注意,在camera2basic中,它们只创建一个CameraCaptureSession。CameraCaptureSession类似于整个摄影机管道的配置,曲面注册在与之配套的是输出管道-硬连接到创建的基础结构中。您不想构建多个基础结构,只需为多个输出设置一个即可。@Sumber谢谢!我对使用分配存储图像缓冲区感兴趣,我做了一些搜索,但看起来很混乱,请给我一个指向n我可以正确使用分配的示例?(以及如何从中正确获取位图?)谢谢!!!我通常只使用显示输出和ImageReader将各种格式保存到磁盘上,这样我就可以在其他环境中使用它们了,所以我不熟悉使用分配和RenderScript进行位图的设备图像处理…抱歉!一定有这方面的教程!