Reproducción de vídeo en un GLSurfaceView en lugar de SurfaceView

He estado luchando con esto durante 2 días ahora … Después de esta respuesta: https://stackoverflow.com/a/2006454/444324 – se menciona que es posible reproducir un video en un GLSurfaceView alterando el ejemplo de MediaPlayerDemo_Video En demostraciones de API:

Todo lo que tienes que hacer es reemplazar SurfaceView con GLSurfaceView tanto en el archivo MediaPlayerDemo_Video.java como en el archivo de diseño correspondiente (mediaplayer_2.xml).

También necesita crear una clase de renderizado personalizada (una que implemente la interfaz GLSurfaceView.Renderer) y establecerla en GLSurfaceView.

Traté de reemplazar el SurfaceView a un GLSurfaceView como se sugirió, también utilizando esto, pero sólo se bloquea en el inicio:

07-11 14:54:22.086: E/AndroidRuntime(12373): FATAL EXCEPTION: main 07-11 14:54:22.086: E/AndroidRuntime(12373): java.lang.NullPointerException 07-11 14:54:22.086: E/AndroidRuntime(12373): at android.opengl.GLSurfaceView.surfaceCreated(GLSurfaceView.java:512) 07-11 14:54:22.086: E/AndroidRuntime(12373): at android.view.SurfaceView.updateWindow(SurfaceView.java:533) 07-11 14:54:22.086: E/AndroidRuntime(12373): at android.view.SurfaceView.access$000(SurfaceView.java:81) 07-11 14:54:22.086: E/AndroidRuntime(12373): at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:169) 07-11 14:54:22.086: E/AndroidRuntime(12373): at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:590) 07-11 14:54:22.086: E/AndroidRuntime(12373): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1617) 07-11 14:54:22.086: E/AndroidRuntime(12373): at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442) 07-11 14:54:22.086: E/AndroidRuntime(12373): at android.os.Handler.dispatchMessage(Handler.java:99) 07-11 14:54:22.086: E/AndroidRuntime(12373): at android.os.Looper.loop(Looper.java:137) 07-11 14:54:22.086: E/AndroidRuntime(12373): at android.app.ActivityThread.main(ActivityThread.java:4575) 07-11 14:54:22.086: E/AndroidRuntime(12373): at java.lang.reflect.Method.invokeNative(Native Method) 07-11 14:54:22.086: E/AndroidRuntime(12373): at java.lang.reflect.Method.invoke(Method.java:511) 07-11 14:54:22.086: E/AndroidRuntime(12373): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 07-11 14:54:22.086: E/AndroidRuntime(12373): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 07-11 14:54:22.086: E/AndroidRuntime(12373): at dalvik.system.NativeStart.main(Native Method) 

Sé que puedo usar un VideoView para reproducir un video o simplemente quedarme con SurfaceView con MediaPlayer pero debo usar un GLSurfaceView porque necesito este video para ser reproducido encima de la vista de la superficie de la cámara.

¡Gracias!

Código relevante: my XML:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <com.commonsware.android.camera.MyGLSurfaceView android:id="@+id/surface" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" /> </LinearLayout> 

Mi clase:

 public class MediaPlayerDemo_Video extends Activity implements OnBufferingUpdateListener, OnCompletionListener, OnPreparedListener, OnVideoSizeChangedListener, SurfaceHolder.Callback { private MediaPlayer mMediaPlayer; private MyGLSurfaceView mPreview; private SurfaceHolder holder; /** * * Called when the activity is first created. */ @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.mediaplayer_2); mPreview = (MyGLSurfaceView) findViewById(R.id.surface); holder = mPreview.getHolder(); holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } } 

Clase MyGLSurfaceView:

 class MyGLSurfaceView extends android.opengl.GLSurfaceView { public MyGLSurfaceView(Context context, AttributeSet attrs) { super(context, attrs); } } 

Echa un vistazo al código disponible aquí para reproducir un video usando OpenGl ES 2.0 con GLSurfaceView

https://github.com/satish13131/Android_Programs/tree/master/graphics/opengl/video/surfaceview

Implica el renderizado de OpenGL para video

OK, resolvió esto … tuve varios errores, pero el error final que presento en mi pregunta se resuelve añadiendo este código a la onCreate:

 mPreview.setRenderer(new Renderer() { @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { // TODO Auto-generated method stub } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { // TODO Auto-generated method stub } @Override public void onDrawFrame(GL10 gl) { // TODO Auto-generated method stub } }); 

Así en un lugar que está arbitrando a android.opengl.GLSurfaceView y el otro a com.commonsware.android.camera.GLSurfaceView que son diferentes GLSurfaceView clases de diferentes paquetes

¿Por qué implementó una clase ( com.commonsware.android.camera.GLSurfaceView ) con el mismo nombre que GLSurfaceView ?

Si declaró la vista como un android.opengl.GLSurfaceView en XML de presentación, no puede convertirla a com.commonsware.android.camera.GLSurfaceView

  • Vista de carrusel de imagen de Android (sentido como)
  • ViewPager omitir las vistas de devolución dejando en blanco
  • agregar imagen a la vista de la superficie en android
  • Android: onPreviewFrame nunca llamado sin SurfaceView
  • Android: ¿Cómo hacer una vista previa de cámara en forma de círculo?
  • ¿Cómo se anima un cambio en el relleno de una vista?
  • Superponer imágenes en la vista previa de la cámara SurfaceView
  • Cómo averiguar si una vista de Android está oscurecida por cualquier otra vista
  • Vista previa de la cámara Android estirada
  • Anular onDraw () o draw ()?
  • Lista de posición de los puntos repetidos en getview
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.