当前位置: 首页 > 知识库问答 >
问题:

在GLSURFACHEVIEW而不是SURFACHEVIEW中播放视频

公冶高峯
2023-03-14

我已经为此挣扎了两天了...以下是答案:https://stackoverflow.com/a/2006454/444324-提到可以通过改变API Demos中的MediaPlayerDemo_Video示例在GLSurfaceView中播放视频:

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

此外,您还需要创建一个自定义渲染器类(一个实现GLSurfaceView的类。渲染器界面),并将其设置为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来播放视频,也可以使用MediaPlayer继续使用SurfaceView,但我必须使用GLSurfaceView,因为我需要在摄像头surface view上播放此视频。

非常感谢。

相关代码:我的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);
    }
}

共有3个答案

耿弘阔
2023-03-14

好的,在一个地方,你是指android.opengl.GLSurfaceView和其他com.commonsware.android.camera.GLSurfaceView他们是不同的GLSurfaceView类从不同的包

闻人栋
2023-03-14

请查看此处提供的使用OpenGl ES 2.0和GLSurfaceView播放视频的代码

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

它涉及到视频的OpenGL渲染

武嘉祥
2023-03-14

好的,解决了这个问题。。。我有几个错误,但我在问题中提出的最后一个错误通过将以下代码添加到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

            }
        });
 类似资料:
  • 我有一个使用来显示视频。现在我想在

  • 在我的应用程序中,我想在目标图像上播放3D视频,我已经在c中启动了摄像头,能够使用自定义视图在目标图像上设置3D图像,现在我的要求是在目标图像上播放3D视频,而不是3D图像,我已经尝试使用自定义GLSURFACHEVIEW播放视频。下面是我的代码,但未调用onSurfaceCreated方法。 调用自定义GLsurfaceview: 我不知道我在哪里失踪了。提前感谢。

  • 只是想知道是否有人能告诉我这是怎么回事。当我播放视频时,我可以听到音频,但视频不显示。这是我的代码,我是初学者

  • 我是绑定播放YouTube视频在WebView,WebView显示视频的第一个外观与播放按钮,但点击播放按钮后开始进度条和2-3秒后停止进度条和屏幕空白与黑色。 Image1:带播放按钮的视频首次查看 Image2:点击播放按钮后,屏幕变为空白。

  • 我在JavaFx媒体中显示视频有问题: 我知道代码没有错,因为在我的同事系统中它显示了。我尝试显示flv文件。我看到问题:JavaFX视频没有播放 我有视窗10 N与K-Lite标准编解码器和jdk-8u65-windows-x64Java我安装了功能包为视窗10像上面的链接。我不知道会有什么问题。

  • 我在一个回收视图中有几张卡片。每张卡都有一个自定义视频视图。单击视频视图,视频应开始。然而,在我的例子中,它只显示蓝色边框,视频没有运行。代码如下所示, 自定义卡视图。xml: 自定义视频视图: 主要活动: activity\u main。xml: 我希望每张卡最初只显示一个缩略图。单击视频后,相关卡应启动视频(不是全部)。视频启动时,VideoView应占据整个屏幕。我怎样才能做到这一点? 谢谢