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

如何使用自定义GLSURFACHEVIEW播放视频?

林浩漫
2023-03-14

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

public class GLPreview extends GLSurfaceView implements
    OnBufferingUpdateListener, OnCompletionListener, OnPreparedListener,
    OnVideoSizeChangedListener, SurfaceHolder.Callback,
    GLSurfaceView.Renderer{

    private static final String TAG = "MediaPlayerDemo";
    private int mVideoWidth;
    private int mVideoHeight;
    private MediaPlayer mMediaPlayer;
    private GLSurfaceView mPreview;
    private SurfaceHolder holder;
    private String path;
    private Bundle extras;
    private static final String MEDIA = "media";
    private static final int LOCAL_VIDEO = 4;
    private static final int STREAM_VIDEO = 5;
    private boolean mIsVideoSizeKnown = false;
    private boolean mIsVideoReadyToBePlayed = false;
    Context context2;

    public GLPreview(Context context, AttributeSet attrs) {
        super(context, attrs);
        // this.setZOrderMediaOverlay(true);
        Log.d(TAG, "GLPreview: OnPause");
        this.context2 = context;

        mPreview = (GLSurfaceView) findViewById(R.id.surface);
        // holder = mPreview.getHolder();
        setBackgroundResource(R.drawable.vuforiasizzlereel);
    }

    public void playVideo() {
        doCleanUp();
        try {

            // Create a new media player and set the listeners
            mMediaPlayer = new MediaPlayer();
                mMediaPlayer.setDataSource(path);           
            mMediaPlayer.setDisplay(holder);
            mMediaPlayer.prepare();
            mMediaPlayer.setOnBufferingUpdateListener(this);
            mMediaPlayer.setOnCompletionListener(this);
            mMediaPlayer.setOnPreparedListener(this);
            mMediaPlayer.setOnVideoSizeChangedListener(this);
            mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

        } catch (Exception e) {
            Log.e(TAG, "error: " + e.getMessage(), e);
        }
    }
    public void onPause() {
        super.onPause();
        Log.d(TAG, "GLPreview: OnPause");
    }

    public void onResume() {
        // this.setZOrderMediaOverlay(true);
        super.onResume();
        Log.d(TAG, "GLPreview: OnResume");
    }
    public void surfaceCreated(SurfaceHolder holder) {
        Log.d(TAG, "GLPreview: surfaceCreated");
        super.surfaceCreated(holder);
    }
    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        Log.d(TAG, String.format(
                "GLPreview: surfaceChanged, format=%d, w=%d, h=%d", format, w,
                h));
        super.surfaceChanged(holder, format, w, h);
    }
    public void surfaceDestroyed(SurfaceHolder holder) {
        Log.d(TAG, "GLPreview: surfaceDestroyed");
        super.surfaceDestroyed(holder);
    }
    protected void onAttachedToWindow() {
        Log.d(TAG, "GLPreview: onAttachedToWindow");
        super.onAttachedToWindow();
    }
    protected void onDetachedFromWindow() {
        Log.d(TAG, "GLPreview: onDetachedFromWindow");
        super.onDetachedFromWindow();
    }
    protected void onWindowVisibilityChanged(int vis) {
        String newVisibility;
        switch (vis) {
        case View.GONE:
            newVisibility = "GONE";
            break;
        case View.INVISIBLE:
            newVisibility = "INVISIBLE";
            break;
        case View.VISIBLE:
            newVisibility = "VISIBLE";
            break;
        default:
            newVisibility = String.format("Unknown constant %d", vis);
        }

        Log.d(TAG, String.format("GLPreview: onWindowVisibilityChanged -> %s",
                newVisibility));
        super.onWindowVisibilityChanged(vis);
    }
    private void doCleanUp() {
        mVideoWidth = 0;
        mVideoHeight = 0;
        mIsVideoReadyToBePlayed = false;
        mIsVideoSizeKnown = false;
    }
    public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
        Log.v(TAG, "onVideoSizeChanged called");
        if (width == 0 || height == 0) {
            Log.e(TAG, "invalid video width(" + width + ") or height(" + height
                    + ")");
            return;
        }
        mIsVideoSizeKnown = true;
        mVideoWidth = width;
        mVideoHeight = height;
        if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
            startVideoPlayback();
        }
    }
    public void onPrepared(MediaPlayer mediaplayer) {
        Log.d(TAG, "onPrepared called");
        mIsVideoReadyToBePlayed = true;
        if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
            startVideoPlayback();
        }
    }

    @Override
    public void onCompletion(MediaPlayer mp) {
        // TODO Auto-generated method stub
    }
    @Override
    public void onBufferingUpdate(MediaPlayer mp, int percent) {
        // TODO Auto-generated method stub
    }
    private void startVideoPlayback() {
        Log.v(TAG, "startVideoPlayback");
        // holder.setFixedSize(mVideoWidth, mVideoHeight);
        mMediaPlayer.start();
    }
    @Override
    public void onDrawFrame(GL10 gl) {
        // TODO Auto-generated method stub
    }
    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        // TODO Auto-generated method stub
    }
    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        // TODO Auto-generated method stub
        Log.d(TAG, "GLPreview : onSurfaceCreated");
        playVideo();
    }
}

调用自定义GLsurfaceview:

GLPreview productView = new GLPreview(CloudReco.this, null); 

我不知道我在哪里失踪了。提前感谢。

共有1个答案

谢华彩
2023-03-14

在这种情况下,不应实现SurfaceHolder。来自GLPreview的回调,因为GLSurfaceView已将回调设置为surfaceholder并调用渲染器。表面处理。因此,您应该只实现GLSurfaceView。渲染器方法-ondrawframe、onsurfacecreated(GL10 gl、EGLConfig配置)。请参阅GLsurfaceView源代码。GLSURFACHEVIEW已实现surfaceCreated(SURFACHEHOLDER holder);并调用渲染器

 类似资料:
  • 实现目标 为 video 元素添加自定义样式的播放控制面板 可滑动调节音量、播放速度 可通过按钮快进、回退 可点击视频画面或按钮播放或暂停视频播放 可点击或拖动进度条选择视频播放进度 解决思路 首先,我们已经有了 HTML 文件,里面包含各种播放器用到的元素,格式也已经在 CSS 文件中帮我们设置好了 在 JS 中选择我们需要添加功能的 HTML 元素,建立好变量 用 JS 写好播放器的功能 给第

  • 我已经为此挣扎了两天了...以下是答案:https://stackoverflow.com/a/2006454/444324-提到可以通过改变API Demos中的MediaPlayerDemo_Video示例在GLSurfaceView中播放视频: 您所要做的就是在MediaPlayerDemo_视频中用GLSurfaceView替换SurfaceView。java文件以及相应的布局文件(med

  • 本文向大家介绍Android自定义SeekBar实现视频播放进度条,包括了Android自定义SeekBar实现视频播放进度条的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Android实现视频播放进度条的具体代码,供大家参考,具体内容如下 首先来看一下效果图,如下所示: 其中进度条如下: 接下来说一说我的思路,上面的进度拖动条有自定义的Thumb,在Thumb正上方有一个Popu

  • null 我意识到如果人们愿意,他们可以找到许多工具来下载视频--所有我想做的是不要在视图源代码中显示到mp4文件的直接链接。 谢谢

  • 通过该接口可以根据用户自定义的customid获取某视频播放记录日志(需要用户实现自定义参数播放统计功能)。目前共三个版本,最新版本为V3: a.当地址为https://spark.bokecc.com/api/playlog/custom/video/v3 特殊说明: 本版本接口在第二版增加分页查询功能基础上,终端细化到Flash、H5-PC、Android、iOS、H5-移动等 需要传递以下参

  • 问题内容: 谁能帮助我如何使用Selenium自动播放/暂停网页上显示的视频。 提前致谢… 问题答案: 这在很大程度上取决于浏览器和处理视频的播放器。您很有可能需要使用JavaScript执行程序。 我昨晚与一位朋友讨论了这个问题,他提出了以下示例,该示例使用了Webdriver的Python变体,用于html5demos.com的演示视频: 您也可以在使用“播放”的地方“暂停”。 这里有一个更大