获取每个android.hardware.camera2帧在surfacetexture上显示之前的数据

Posted

技术标签:

【中文标题】获取每个android.hardware.camera2帧在surfacetexture上显示之前的数据【英文标题】:get data of each android.hardware.camera2 frame before it is displayed on the surfacetexture 【发布时间】:2015-09-22 15:52:48 【问题描述】:

在我的 android 应用程序中,我需要获取 android.hardware.camera2 返回的每一帧,对其数据进行一些处理,然后才将其显示在表面纹理上。 这个问题与我的类似,但对我没有帮助: Camera preview image data processing with Android L and Camera2 API

我试图从这里获取框架(如问题答案中所建议的那样):

private final ImageReader.OnImageAvailableListener mOnImageAvailableListener
            = new ImageReader.OnImageAvailableListener() 

        @Override
        public void onImageAvailable(ImageReader reader) 

            Log.d("Img", "onImageAvailable");
            mBackgroundHandler.post(new ImageSaver(reader.acquireNextImage(), mFile));
        

    ;

这没有用,因为回调仅在用户执行图像捕获后调用。而且我不仅需要在捕获时使用它,还需要获取发送到 camerapreview 表面的每一帧。 我想知道,也许农场可以在这里(从纹理):

public void onSurfaceTextureUpdated(SurfaceTexture texture) 
            Log.d("Img", "onSurfaceTextureUpdated");

        

如果是,怎么做?

我正在使用来自谷歌的这个示例,作为基础:

https://github.com/googlesamples/android-Camera2Basic

【问题讨论】:

SurfaceTexture 将相机帧转换为 OpenGL ES 纹理,然后在预览 Surface 上渲染。您可以将其渲染到屏幕外 pbuffer 并使用glReadPixels() 读取像素。不确定这是否是在 Camera2 中执行此操作的最佳方式。 谢谢。我会尝试。但可能有一种方法可以直接从相机回调中获取。 【参考方案1】:

是的,您绝对可以从相机回调中获取缓冲区。您可以提供自己的纹理并在需要时对其进行更新,甚至可以修改此缓冲区的像素数据。

您应该将“原始”SurfaceTexture(在 createCaptureSession() 中指定)推离屏幕,否则它会干扰您过滤/修改的缓冲区。

这种方法的主要警告是,您现在有责任及时生成伪预览缓冲区。

【讨论】:

【参考方案2】:

我也想做一些图像处理。我一直在研究 github.com/googlesamples/android-Camera2Basic 上的代码,我相信 mCaptureSession 会将相机的管道重定向到预览纹理和捕捉本身,但不能同时重定向到两者。预览纹理由 mCaptureSession.setRepeatingRequest 进行“刷新”,并且当在 captureStillPicture() 上触发“捕获”时调用 mOnImageAvailableListener,但是如果禁用“预览纹理”并且使用与“预览纹理”相同的构建器设置重复请求' 必须尝试调用 mOnImageAvailableListener 它只是不起作用。有其他人一直在努力吗?有什么启示吗?

【讨论】:

以上是关于获取每个android.hardware.camera2帧在surfacetexture上显示之前的数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在每个日期获取每个类型的最大 ID

java 获取每个月的固定时间

获取 Tesseract 中每个单词的位置

如何实现 Stream 以获取每个文档的子集合列表? -扑

R语言dataframe获取每个字段(特征)的数据类型实战:使用sapply函数获取每个字段(特征)的数据类型通过柱状图可视化特征的种类以及个数

如何获取每个用户的对话并包含消息?