"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
不知何故在某处找到了一些表面。根据 documentation,getSurface()
所做的是:
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
。
我正在 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
不知何故在某处找到了一些表面。根据 documentation,getSurface()
所做的是:
Get a
Surface
that can be used to produceImage
for thisImageReader
谁能解释一下它是从哪里得到的?
即Surface
属于ImageReader
;它是在 ImageReader's
构造函数的本机等效项中创建的,并且(实际上)是一个 ImageReader
私有成员,具有 getter.
Here 是本机构造函数中设置 IGraphicBufferProducer
(gbProducer
) 的行,它基本上等同于 Surface
.
Here 是您可以看到本机代码使用同一成员从 getSurface()/nativeGetSurface()
形成 return 值的地方(您可能需要稍微跟踪一下代码,但它都在那里)。
这就是您问题的字面答案。但也许你问是因为不清楚为什么相机不创建 Surface
,而是强制你将它提供给 ImageReader
,而不是: Surface
是一个复杂的对象(实际上是一个缓冲区队列),不应该被认为是一个简单的、预先分配的位图。在捕获发生时,相机管道将与其输出 Surfaces
通信,并设置正确的尺寸和颜色平面等。 (请注意,您可以通过 addTarget()
添加多个目标;相机可以使用它们中的每一个。)相机需要知道的只是它将输出发送到哪里;它不需要自己创建输出 Surface
。