2012-01-16 66 views
3

onPreviewFrame僅在來自攝像機的預覽幀顯示時才被調用。我在這裏使用相同的技術處理圖像作爲一個開放的GL質地:有沒有更好的方式來獲取相機像素比onPreviewFrame在Android上?

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

但它似乎是一個浪費渲染預覽畫面只是這樣我就可以在它上面繪製與我的紋理圖像。有沒有比在調用onPreviewFrame期間更好地從攝像頭獲取像素的方法?

回答

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); 
+0

對我來說,'setOnFrameAvailableListener()'中止實時預覽。轉載於股票4.1.2 Nexus S,所以這不是未列出的OEM的一些錯誤。相反,帶'onSurfaceTextureUpdated()'回調函數的'setSurfaceTextureListener()'可用於追蹤單個幀。 – 2014-01-03 20:52:12

相關問題