【问题标题】:Android Camera2 Basics APIAndroid Camera2 基础 API
【发布时间】:2015-08-20 01:50:49
【问题描述】:

我正在从这里阅读有关 Android Camera2 API 的代码: https://github.com/googlesamples/android-Camera2Basic

这几行令人困惑: https://github.com/googlesamples/android-Camera2Basic/blob/master/Application/src/main/java/com/example/android/camera2basic/Camera2BasicFragment.java#L570-L574

previewRequest 构建器仅添加表面,即要显示的 TextureView,作为目标。但以下行实际上将两者都添加为目标。据我了解,这不应该在预览期间触发“OnImageAvailable”监听器,不是吗?那么为什么要在这里添加图像阅读器的表面呢?

我试图在这里删除这个图像阅读器的表面,但是当我真的想捕捉图像时出错.....

太混乱了!!!

【问题讨论】:

  • ImageReader 用于获取捕获的图像数据以保存在文件中。并且ImageReader的表面必须添加到CaptureSession才能使用CaptureRequest.Builder进行抓图,根据doc

标签: android android-camera


【解决方案1】:

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

每当您创建CaptureRequest 时,都会添加一个(列表)目标输出Surface(s)。这是来自捕获帧的图像数据将进入的地方 - 它可能是与 TextureView 相关联的 Surface 用于显示,或与 ImageReader 用于保存,或与 Allocation 用于处理等( Surface 实际上只是一个缓冲区,可以获取相机输出的数据。缓冲区所关联的对象类型决定了您如何访问/处理数据。)

您不必将每个帧的数据发送到所有已注册的Surfaces,但必须将其发送到其中的一个子集。如果 CaptureRequest 在创建时未向 CameraCaptureSession 注册,则不能将 Surface 作为目标添加到 CaptureRequest。好吧,你可以,但是将它传递给会话会导致崩溃,所以不要。

【讨论】:

  • 嗨萨姆纳,感谢您的解释。据我了解,有两种不同的捕获会话,一种用于预览,一种用于实际捕获。我很困惑,因为我应该只将图像阅读器的表面注册到真正的捕获会话,不是吗?
  • CameraCaptureSession 大且成本高,而且很少创建。通常,您决定出于各种目的(显示、保存等)要发送到哪些输出表面,然后创建一个单独的会话,其中每个都注册到它,以便您可以随时通过发出CaptureRequests 到该部分。您应该注意到在 camera2basic 中他们只创建了一个 CameraCaptureSession。
  • CameraCaptureSession 就像整个相机管道的配置,向其注册的 Surface 是输出管道 - 硬连线到创建的基础设施中。您不想构建多个基础架构,只需为多个输出设置一个即可。
  • @Sumber 谢谢!我对使用 Allocation 来存储图像缓冲区很感兴趣,我做了一些搜索,看起来很混乱,请你给我一个可以正确使用 Allocation 的示例的指针吗? (也许如何从中正确获取位图?)谢谢!!!
  • 我实际上通常只使用显示输出和 ImageReaders 将各种格式保存到磁盘,所以我可以在其他环境中处理它们,所以我不熟悉使用 Allocations 和 RenderScript 进行设备上图像处理位图...对不起!不过,这方面肯定有教程!
猜你喜欢
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2017-05-03
  • 1970-01-01
  • 1970-01-01
  • 2022-09-29
  • 2016-12-28
  • 1970-01-01
相关资源
最近更新 更多