在Android上有更好的方法来获取相机像素而不是onPreviewFrame吗?

时间:2012-01-16 02:42:01

标签: android android-camera

onPreviewFrame仅在显示来自摄像机的预览帧时被调用。我正在使用相同的技术将图像处理为开放的gl纹理:

http://nhenze.net/?p=172&cpage=1#comment-8424

但是将预览渲染到屏幕上似乎是浪费,所以我可以用我的纹理图像绘制它。从调用onPreviewFrame开始,是否有更好的方法从相机获取像素?

1 个答案:

答案 0 :(得分:4)

是的,您可以使用SurfaceTexture。这里有一些温和的诡计,因为它需要是一个外部纹理而不是正常的2D纹理。

这意味着如果使用ES2渲染纹理,则需要使用

#extension GL_OES_EGL_image_external : require
uniform samplerExternalOES s_texture;
片段着色器中的

示例代码:

    int[] textures = new int[1];
    // generate one texture pointer and bind it as an external texture.
    GLES20.glGenTextures(1, textures, 0);
    GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textures[0]);
    // No mip-mapping with camera source.
    GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,
            GL10.GL_TEXTURE_MIN_FILTER,
                            GL10.GL_LINEAR);        
    GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,
            GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
    // Clamp to edge is only option.
    GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,
            GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);
    GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,
            GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);


    int texture_id = textures[0];
    SurfaceTexture mTexture = new SurfaceTexture(texture_id);
    mTexture.setOnFrameAvailableListener(this);

    Camera cam = Camera.open();
    cam.setPreviewTexture(mTexture);