我正在使用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
的类的对象,而backgroundHandler
只是一个后台线程。我没有包括这两个或previewRequestBuilder
的代码,因为它们对于理解我的问题似乎并不重要。
我进行了广泛的搜索,但似乎发生了一些魔术,previewReader
以某种方式发现了某个地方的表面。根据{{3}},getSurface()
的作用是:
获取一个
Surface
,可用来为此Image
产生ImageReader
任何人都可以解释它的来源吗?
答案 0 :(得分:2)
Surface
属于ImageReader
;它是用ImageReader's
构造函数的本机等效物创建的,并且(有效地)是ImageReader
私有成员,带有吸气剂。
Here是本机构造函数中用于设置IGraphicBufferProducer
(gbProducer
)的行,该行基本上等效于Surface
。
Here在这里,您可以看到本机代码使用相同的成员来形成getSurface()/nativeGetSurface()
的返回值(您可能需要对代码进行一点点跟踪,但就在那儿)。
这就是您的问题的字面答案。但是也许您在问,因为不清楚为什么相机不创建Surface
并强迫您将其提供给ImageReader
,相反:Surface
很复杂对象(实际上是缓冲区队列),不应将其视为简单的预分配位图。进行捕捉时,相机管线将与其输出Surfaces
通信,并设置正确的尺寸和颜色平面等。 (请注意,您可以通过addTarget()
添加多个目标;相机可以使用它们中的每个。)相机需要知道的是它将输出发送到的位置;不需要自己创建输出Surface
。