0

我正在使用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以某种方式在某个地方找到了一些表面。根据文档,要做getSurface()的是:

获取一个Surface可用于为此生产ImageImageReader

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

4

1 回答 1

3

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

是本机构造函数中设置IGraphicBufferProducer( gbProducer) 的行,它基本上是 a 的本机等价物Surface

在这里您可以看到本机代码使用相同的成员来形成返回值getSurface()/nativeGetSurface()(您可能需要稍微跟踪代码,但它就在那里)。

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

于 2019-08-07T01:20:38.173 回答