Procesamiento de vídeo en Android 3.x / Google TV / SDK: Marco de vídeo a SurfaceTexture / OpenGL / GLSL

Después de pasar algún tiempo en él, podría ser mejor preguntar. Gracias por ayudar, chicos!

Pregunta

  • ¿Cómo renderizar una trama de vídeo de MediaPlayer o VideoView a SurfaceTexture o una textura de OpenGL, para cambiar el color de la textura / fragmento a través de GLSL? (Lo necesitamos para las rutinas de procesamiento de vídeo GLES / GLSL).

Contexto

A) Google TV (dispositivo LG G2 2012) es un dispositivo Android 3.2 con soporte para SDK (sin NDK)

B) Es fácil de hacer desde la cámara a SurfaceTexture, pero ¿cómo hacer el vídeo a SurfaceTexture en Android 3.x? Para la solución de la cámara, vea abajo.

C) Ya estoy haciendo marcos de video a un GLView / GLRenderer, pero no estoy cogiendo un marco para cambiarlo a través de GLSL. Parece que no funciona. Pero necesito texturas GLES / GLSL accesibles con datos de video para procesamiento de video:

Clase MainActivity:

public void onCreate(Bundle state) { super.onCreate(state); m_View = new GLSimpleView(this); setContentView(m_View); m_Holder = m_View.getHolder(); m_Holder.addCallback(this); m_Holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } 

Clase GLSimpleView:

 public GLSimpleView(Context context) { super(context); m_Renderer = new GLTextureRenderer(context); this.setRenderer(m_Renderer); } 

GLTextureRender clase:

 int[] textures = new int[1]; GLES20.glGenTextures(1, textures, 0); m_SurfaceTexture = textures[0]; GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTextureID); GLES20.glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST); GLES20.glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); GLES20.glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); GLES20.glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); m_Surface = new SurfaceTexture(m_SurfaceTexture); m_Surface.setOnFrameAvailableListener(this); // THIS ONE DOESN'T WORK WITH ANDROID 3.x! // HOW TO BIND m_Surface TO m_MediaPlayer? //Surface surface = new Surface(m_Surface); //m_MediaPlayer.setSurface(surface); //surface.release(); 

También compare esto:

  • SurfaceTexture para cámara (Necesito este para MediaPlayer o VideoView!): Uso de SurfaceTexture en Android

  • Vídeo a GLView (no hay acceso a texturas a través de GLSL!): Reproduciendo video en un GLSurfaceView en lugar de SurfaceView

  • Android 4.x SDK VideoSurfaceTexture muestra (no compatible con 3,2): http://source-android.frandroid.com/cts/tests/src/android/media/cts/VideoSurfaceView.java

  • Android MediaPlayer (en Android 3.x no hay soporte de setSurface ()!): Http://developer.android.com/reference/android/media/MediaPlayer.html

Por lo tanto la pregunta principal sigue siendo: ¿Cómo acceder y manipular un marco de vídeo con Android 3.x? Tal vez una solución diferente? ¿Me estoy perdiendo algo, después de pasar demasiado tiempo? Considere que no hay soporte de NDK en Google TV en absoluto, que somos muy limitados si tratamos de manipular datos de video.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.