【问题标题】:Playing video in a GLSurfaceView instead of SurfaceView在 GLSurfaceView 而不是 SurfaceView 中播放视频
【发布时间】:2012-07-11 00:19:15
【问题描述】:

我已经为此苦苦挣扎了 2 天... 按照这个答案:https://stackoverflow.com/a/2006454/444324 - 提到可以通过更改 API 演示中的 MediaPlayerDemo_Video 示例在 GLSurfaceView 中播放视频:

您所要做的就是将 SurfaceView 替换为 MediaPlayerDemo_Video.java 文件中的 GLSurfaceView 以及 在相应的布局文件(mediaplayer_2.xml)中。

您还需要创建一个自定义 Renderer 类(实现 GLSurfaceView.Renderer 接口)并将其设置为您的 GLSurfaceView。

我尝试按照建议将 SurfaceView 替换为 GLSurfaceView,同样是 using this,但它只是在启动时崩溃:

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 播放视频,或者只使用带有 MediaPlayer 的 SurfaceView,但我必须使用 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 MyGLSurfaceView extends android.opengl.GLSurfaceView {
    public MyGLSurfaceView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
}

【问题讨论】:

    标签: android surfaceview glsurfaceview


    【解决方案1】:

    查看此处提供的代码,用于使用带有 GLSurfaceView 的 OpenGl ES 2.0 播放视频

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

    它涉及视频的OpenGL渲染

    【讨论】:

      【解决方案2】:

      好的,解决了这个问题...我有几个错误,但我在问题中出现的最后一个错误是通过将此代码添加到 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
      
                  }
              });
      

      【讨论】:

        【解决方案3】:

        你为什么要实现一个与GLSurfaceView同名的类(com.commonsware.android.camera.GLSurfaceView)?

        如果您在布局 XML 中将视图声明为 android.opengl.GLSurfaceView,则不能将其转换为 com.commonsware.android.camera.GLSurfaceView

        【讨论】:

        • 我也尝试重命名它(甚至删除并创建了一个名为 MyGLSurfaceView 的新名称)...同样的错误。
        【解决方案4】:

        你在一个地方引用android.opengl.GLSurfaceView,另一个引用com.commonsware.android.camera.GLSurfaceView,它们是来自不同包的不同 GLSurfaceView 类

        【讨论】:

        • 正如我提到的“似乎是一个相当简单的转换错误,但我找不到任何原因......”我不知道为什么它会打印此错误消息..因为我只使用过我的 GLSurfaceView 直接...在我使用的 XML 中:com.commonsware.android.camera.GLSurfaceView 和在 Java 中我导入了我的类并且导入正常...
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-10
        • 1970-01-01
        相关资源
        最近更新 更多