Android Camera2 API显示已处理的预览图像

rcm*_*lli 6 android android-camera

新的Camera 2 API与旧的相比非常不同.显示操纵的相机帧到管道的用户部分让我感到困惑.我知道使用Android L和Camera2 API相机预览图像数据处理有很好的解释,但显示帧仍然不清楚.我的问题是,在一些处理过程中,在ImageReaders回调函数中显示帧的方式是什么,同时保持Camera2 api管道的效率和速度?

示例流程:

camera.add_target(imagereader.getsurface) - >关于imagereaders回调做一些处理 - >(在屏幕上显示已处理的图像?)

解决方法创意:每次处理新帧时,都会将位图发送到imageview.

Edd*_*ala 15

澄清问题后编辑; 最初的答案在底部

取决于您在哪里进行处理.

如果您正在使用RenderScript,则可以将Surface从SurfaceView或TextureView连接到Allocation(使用setSurface),然后将处理后的输出写入该Allocation并使用Allocation.ioSend()将其发送出去.该HDR取景器的演示使用了这种方法.

如果您正在进行基于EGL着色器的处理,则可以使用eglCreateWindowSurface将Surface连接到EGLSurface,将Surface作为native_window参数.然后,您可以将最终输出渲染到该EGLSurface,当您调用eglSwapBuffers时,缓冲区将被发送到屏幕.

如果您正在进行本机处理,则可以使用NDK ANativeWindow方法写入从Java传递的Surface并转换为ANativeWindow.

如果你正在进行Java级处理,那真的很慢而且你可能不想这样做.但是可以使用新的Android M ImageWriter类,或者每帧都将纹理上传到EGL.

或者如您所说,每帧都绘制一个ImageView,但这样会很慢.


原始答案:

如果要捕获JPEG图像,只需将ByteBuffer的内容复制Image.getPlanes()[0].getBuffer()到a中byte[],然后使用BitmapFactory.decodeByteArray它将其转换为Bitmap.

如果您正在捕获YUV_420_888图像,那么您需要将自己的转换代码从3平面YCbCr 4:2:0格式写入您可以显示的内容,例如RGB []的RGB值来创建位图; 遗憾的是,还没有一个方便的API.

如果您正在捕获RAW_SENSOR图像(拜耳模式未处理的传感器数据),那么您需要进行大量图像处理或只需保存DNG.

  • 如果您希望过滤录制的视频,则需要从摄像机接收帧,对其进行过滤,然后将其发送到屏幕和视频编码器.您可以从MediaRecorder或MediaCodec获取Surface,并通过使用Surface创建新的EGLImage,或使用带有ImageWriter的Java,或使用带有Allocation.ioSend()的RenderScript,从OpenGL发送数据.哪种方法最有效取决于您希望如何编写过滤器. (2认同)