Playing video in a GLSurfaceView instead of SurfaceView

11,832

Solution 1

OK, solved this... I had several errors but the final error I present in my question is solved by adding this code to the 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

            }
        });

Solution 2

Check out the code available here for playing a video using OpenGl ES 2.0 with GLSurfaceView

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

It involves OpenGL rendering for video

Share:
11,832
Lior Iluz
Author by

Lior Iluz

Updated on June 09, 2022

Comments

  • Lior Iluz
    Lior Iluz almost 2 years

    I've been struggling with this for 2 days now... Following this answer: https://stackoverflow.com/a/2006454/444324 - it is mentioned that it's possible to play a video in a GLSurfaceView by altering the MediaPlayerDemo_Video example in API Demos:

    All you have to do there is to replace the SurfaceView with a GLSurfaceView in both the MediaPlayerDemo_Video.java file as well as in the corresponding layout file (mediaplayer_2.xml).

    Also you need to create a custom Renderer class (one that implements the GLSurfaceView.Renderer interface) and set it to your GLSurfaceView.

    I tried replacing the SurfaceView to a GLSurfaceView as suggested, also using this but it just crashes on start:

    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)
    

    I know I can use a VideoView to play a video or just stay with SurfaceView with MediaPlayer but I must use a GLSurfaceView because I need this video to be played on top of the camera surface view.

    Thank you!

    Relevant code: 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>
    

    My Class:

    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);
    
        }
    }
    

    MyGLSurfaceView Class:

    class MyGLSurfaceView extends android.opengl.GLSurfaceView {
        public MyGLSurfaceView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    }
    
  • Lior Iluz
    Lior Iluz almost 12 years
    As I mentioned "Seems like a fairly simple casting mistake but I couldn't find any reason for that..." I don't know why it prints this error message.. as I used only my GLSurfaceView directly... in XML I used: com.commonsware.android.camera.GLSurfaceView and in Java I imported my class and the import is ok...
  • Lior Iluz
    Lior Iluz almost 12 years
    I also tried renaming it (even deleted and created a new one named MyGLSurfaceView)... same error.