"ImageReader.getSurface()" 是如何工作的?

How does "ImageReader.getSurface()" work?

我正在 android 中使用 camera2 API 并试图理解我正在使用的这段代码。部分代码如下:

previewReader = ImageReader.newInstance(previewSize.getWidth(), previewSize.getHeight(), 
                                        ImageFormat.YUV_420_888, 4);

previewReader.setOnImageAvailableListener(imageListener, backgroundHandler);
// This adds another output surface but not sure where this surface comes from..
previewRequestBuilder.addTarget(previewReader.getSurface());

imageListener 是来自另一个实现 android.media.ImageReader.OnImageAvailableListener 的 class 的对象,而 backgroundHandler 只是一个后台线程。我不包括这两个或 previewRequestBuilder 的代码,因为它们对于理解我的问题似乎并不重要。

我进行了广泛的搜索,但似乎发生了一些魔法,previewReader不知何故在某处找到了一些表面。根据 documentationgetSurface() 所做的是:

Get a Surface that can be used to produce Image for this ImageReader

谁能解释一下它是从哪里得到的?

Surface属于ImageReader;它是在 ImageReader's 构造函数的本机等效项中创建的,并且(实际上)是一个 ImageReader 私有成员,具有 getter.

Here 是本机构造函数中设置 IGraphicBufferProducer (gbProducer) 的行,它基本上等同于 Surface.

Here 是您可以看到本机代码使用同一成员从 getSurface()/nativeGetSurface() 形成 return 值的地方(您可能需要稍微跟踪一下代码,但它都在那里)。

这就是您问题的字面答案。但也许你问是因为不清楚为什么相机不创建 Surface,而是强制你将它提供给 ImageReader,而不是: Surface 是一个复杂的对象(实际上是一个缓冲区队列),不应该被认为是一个简单的、预先分配的位图。在捕获发生时,相机管道将与其输出 Surfaces 通信,并设置正确的尺寸和颜色平面等。 (请注意,您可以通过 addTarget() 添加多个目标;相机可以使用它们中的每一个。)相机需要知道的只是它将输出发送到哪里;它不需要自己创建输出 Surface