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).
- Invisible SurfaceView para previsualización de la cámara
- Combatiendo con SurfaceView, Camera y OpenGL
- Android Move ImageView
- ¿Centrar el texto verticalmente independientemente de la altura de la vista?
- ¿Qué tipo de conexión existe entre innerRadiusRatio y thicknessRatio de la clase GradientDrawable?
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); } }
- SuperficieCreada () Nunca llamado
- Vista androide o surfaceView, ¿qué debo usar?
- ¿Existen bibliotecas de terceros para Android?
- Crear ImageView de forma programática sin diseño
- Cómo escalar el video en un SurfaceView más grande que la ventana en Android?
- Administrar los objetos View y Class <?> Actuales
- Android: una nueva pregunta GUI - ¿cómo declarar viewGroup, sin formato de archivo XML?
- Android - ¿Cómo circular zoom / ampliar parte de la imagen?
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
- MVVMCross Obtener SelectedItem de un MvxBindableListView
- ¿Puedo confiar en el recolector de basura para detener un AsyncTask?