2012-01-16 6 views
3

onPreviewFrameは、カメラからのプレビューフレームが表示されるときにのみ呼び出されます。私はここで同じ手法使用したオープンglのテクスチャとして画像を処理しています:AndroidのonPreviewFrameよりもカメラのピクセルを取得する良い方法はありますか?

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()'を使って個々のフレームを追跡することができます。 –

関連する問題