Воспроизведение видео в GLSurfaceView вместо SurfaceView

Я боролся с этим уже 2 дня... После этого ответа: /questions/29154735/vosproizvodit-video-s-pomoschyu-opengles-android/29154749#29154749 - упомянуто, что можно воспроизвести видео в GLSurfaceView, изменив пример MediaPlayerDemo_Video в демоверсиях API:

Все, что вам нужно сделать, это заменить SurfaceView на GLSurfaceView как в файле MediaPlayerDemo_Video.java, так и в соответствующем файле макета (mediaplayer_2.xml).

Также вам нужно создать собственный класс Renderer (тот, который реализует интерфейс GLSurfaceView.Renderer) и установить его в свой GLSurfaceView.

Я попытался заменить SurfaceView на GLSurfaceView, как было предложено, также используя это, но он просто вылетает при запуске:

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)

Я знаю, что могу использовать VideoView для воспроизведения видео или просто остаться с SurfaceView с MediaPlayer, но я должен использовать GLSurfaceView, потому что мне нужно, чтобы это видео воспроизводилось поверх вида поверхности камеры.

Спасибо!

Соответствующий код: мой 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>

Мои занятия:

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

4 ответа

Решение

Хорошо, решил это... У меня было несколько ошибок, но последняя ошибка, которую я представляю в своем вопросе, решается путем добавления этого кода в 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

            }
        });

Проверьте код, доступный здесь, для воспроизведения видео с использованием OpenGl ES 2.0 с GLSurfaceView

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

Включает рендеринг OpenGL для видео

Ну в одном месте вы ссылаетесь на android.opengl.GLSurfaceView а другой к com.commonsware.android.camera.GLSurfaceView это разные классы GLSurfaceView из разных пакетов

Почему вы реализовали класс (com.commonsware.android.camera.GLSurfaceView) с тем же именем, что и GLSurfaceView?

Если вы объявили вид как android.opengl.GLSurfaceView в макете XML вы не можете привести его к com.commonsware.android.camera.GLSurfaceView

Другие вопросы по тегам