使用 OpenGL 更快的相机预览?

Posted

技术标签:

【中文标题】使用 OpenGL 更快的相机预览?【英文标题】:faster camera preview using OpenGL? 【发布时间】:2012-06-30 02:25:13 【问题描述】:

编写一个从相机获取预览帧的应用程序对其进行一些转换,然后将其显示在屏幕上。

public void onPreviewFrame(byte[] data, Camera camera) 

我将数据在另一个线程中的 JNI 中进行 yuv2rgb 和一些像素操作。然后我从 RGB int 数组创建位图并使用

canvas.drawBitmap(bmp, 0, 0, null);

我在 HTC Nexus One 上以 640x480 获得大约 15-20FPS,在三星 Galaxy S II 上获得 30+ FPS

我想知道是否可以通过使用 android OpenGL ES 进行绘图来加快速度? 我将遵循本指南: http://obviam.net/index.php/texture-mapping-opengl-android-displaying-images-using-opengl-and-squares/

【问题讨论】:

【参考方案1】:

您是否将 SurfaceView 用于您的相机应用程序?您获得的预览帧是屏幕上显示的实际帧的副本。我猜你添加了另一个视图来显示回调预览帧。

我不是图形专家,但你为什么不试试SurfaceTexture。您可以使用 setpreviewtexture() 代替 setpreviewwindow()。这样,Camera Service 将直接将缓冲区发送到应用程序,而不是制作副本并将其排队到 AndroidNativeWindow。这可能会提高您的表现。

这就是安卓相机应用全景的工作原理。可以找到源代码here

【讨论】:

不幸的是,SurfaceTexture 只是 API >=11。此应用是为 API9+ 开发的【参考方案2】:

实现了 OpenGL ES,它确实有助于提高性能

【讨论】:

嘿,我知道这是旧的,但也许你可以帮助我?我正在开发一个相机应用程序并试图找到有关如何实现 OpenGL ES 以提高性能的资源? 您能说得更具体些吗? 嗯基本上我只是想通过opengl实现相机预览。通过 GLSurfaceView。然后,我将使用它来使用户能够拍摄照片。我想它类似于 SnapChats 和 Instagrams 相机功能的工作方式? 基本上首先你必须从相机中获取帧,我认为它在 onPreviewFrame 方法中。现在这些帧是 YUV422 格式,所以如果你想对其进行一些操作,你可能需要将它们转换为 RGB。然后你把它发送到 OpenGL 可能是因为这个:***.com/questions/8676046/…

以上是关于使用 OpenGL 更快的相机预览?的主要内容,如果未能解决你的问题,请参考以下文章

Android openGl开发详解-相机预览

Android OpenGL基础相机预览及滤镜

TextureView 的裁剪相机预览

美颜相机-GPUImage/openGL相机预览性能问题分析及优化

美颜相机-GPUImage/openGL相机预览性能问题分析及优化

美颜相机-GPUImage/openGL相机预览性能问题分析及优化