美文网首页
android使用阿里云sdk播放器 实现切换全屏播放

android使用阿里云sdk播放器 实现切换全屏播放

作者: 达布遛 | 来源:发表于2020-01-03 14:41 被阅读0次

项目中使用阿里云sdk点播 基础版播放视频,找了一遍竟然没找到官方的具体使用文档,好在有先前资料加本身思考,实现了阿里云+surfaceview 来进行窗口和全屏播放。

我的实现思路是窗口是一个surfaceview,全屏时隐藏一个充满屏幕的surfaceview 并充满屏幕。
下面是代码:

private SurfaceHolder.Callback mCallback;
private SurfaceView surface_view;
private SurfaceHolder mHolder;

首先在成员变量中声明surfaceview 相关组件,当然这里两个surfaceview的都需要

    public void init() {
        initView();
        initCallBack();
        mHolder.addCallback(mCallback);
        FullmHolder.addCallback(mCallback);
        initData();
    }
``
两个surfaceview 使用一个 mCallback 就可以。


``
private void initCallBack() {

        mCallback = new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                Glide.with(WarIntroduceActivity.this).load(R.drawable.gif_video_loading).into(new GlideDrawableImageViewTarget(iv_warload, 50));
                if (mPlayer == null) {
                    if (ISFULLSCREEN) {
                        LogUtils.e("AliVcMediaPlayer进入了方法surfaceCreated :+" + ISFULLSCREEN);
                        mPlayer = new AliVcMediaPlayer(WarIntroduceActivity.this, sv_full_view);
                    } else {
                        LogUtils.e("AliVcMediaPlayer进入了方法surfaceCreated :+" + ISFULLSCREEN);
                        mPlayer = new AliVcMediaPlayer(WarIntroduceActivity.this, surface_view);
                    }

                    mPlayer.setMediaType(MediaPlayer.MediaType.Vod);//设置视频类型:点播
                    mPlayer.setCirclePlay(false);//视频循环播放
                    //设置渲染模式  全屏播放
                    mPlayer.setVideoScalingMode(MediaPlayer.VideoScalingMode.VIDEO_SCALING_MODE_SCALE_TO_FIT);
                    mPlayer.setPlayingCache(true, sdDir, 60, 300);
                    if (!TextUtils.isEmpty(videoUrl)) {
                        mPlayer.prepareToPlay(videoUrl);
                    }
                } else {
                    if (ISFULLSCREEN) {
                        LogUtils.e("进入了方法surfaceCreated :+" + ISFULLSCREEN);
                        mPlayer.setVideoSurface(FullmHolder.getSurface());
                        if (ISBACKGROUD) {
                            mHandler.sendEmptyMessageDelayed(BACKGROUDPAUSE, 100);
                        }
                    } else {
                        LogUtils.e("进入了方法surfaceCreated :+" + ISFULLSCREEN);
                        mPlayer.setVideoSurface(mHolder.getSurface());
                        if (ISBACKGROUD) {
                            mHandler.sendEmptyMessageDelayed(BACKGROUDPAUSE, 100);
                        }
                    }

                }

                //设置最大缓存单个最大时长一分钟,缓存目录总大小300M

                mPlayer.setPreparedListener(new MediaPlayer.MediaPlayerPreparedListener() {//准备完成
                    @Override
                    public void onPrepared() {
                        mPlayer.play();
                        iv_play_big.setVisibility(View.VISIBLE);
                        iv_warload.setVisibility(View.GONE);
                        isLoadready = true;
                        LogUtils.e("setPreparedListener");
                        mHandler.sendEmptyMessageDelayed(PAUSEPLAY, 150);
                    }
                });
                mPlayer.setVideoSizeChangeListener(new MediaPlayer.MediaPlayerVideoSizeChangeListener() {
                    @Override
                    public void onVideoSizeChange(int i, int i1) {

                    }
                });
                mPlayer.setErrorListener(new MediaPlayer.MediaPlayerErrorListener() {

                    @Override
                    public void onError(int i, String s) {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {

                                switch (i) {
                                    case 4003:
                                        ToastUtil.showShortToast(s);
                                        break;
                                    case 4018:
                                        ToastUtil.showShortToast(s);
                                        break;
                                    case 4019:
                                        ToastUtil.showShortToast(s);
                                        break;
                                    case 4004:
                                        ToastUtil.showShortToast(s);
                                        break;
                                    case 4005:
                                        ToastUtil.showShortToast(s);
                                        break;
                                    case 4008:
                                        ToastUtil.showShortToast(s);
                                        break;
                                }
                            }
                        });
                    }
                });

                mPlayer.setStoppedListener(new MediaPlayer.MediaPlayerStoppedListener() {//停止播放监听
                    @Override
                    public void onStopped() {

                    }
                });

                mPlayer.setCompletedListener(new MediaPlayer.MediaPlayerCompletedListener() {//播放完成

                    @Override
                    public void onCompleted() {
                        if (NetUtil.isNetConnected(WarIntroduceActivity.this)) {
                            mPlayer.prepareToPlay(videoUrl);
                            playpause();

                        } else {//网络不可用
                            ToastUtil.showLongToast(getResources().getString(R.string.tv_nothing_net));
                        }
                        LogUtils.e("setCompletedListener");
                    }
                });

                mPlayer.setInfoListener(new MediaPlayer.MediaPlayerInfoListener() {
                    @Override
                    public void onInfo(int i, int i1) {

                    }
                });


                mPlayer.setFrameInfoListener(new MediaPlayer.MediaPlayerFrameInfoListener() {//首帧显示
                    @Override
                    public void onFrameInfoListener() {
                        LogUtils.e("mPlayersetFrameInfoListener");
                        mHandler.sendEmptyMessageDelayed(UPDATE_PROGRESS, 300);
                    }
                });


            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                if (mPlayer != null) {
                    LogUtils.e("销毁了surfaceDestroyed :+" + ISFULLSCREEN);

                }
            }
        };

    }

在callback中初始化AliVcMediaPlayer,具体为什么我也不太清楚。

需要监听横屏和竖屏改变时 做一些操作

 public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            if (mPlayer.isPlaying()) {
                iv_play_big_full.setVisibility(View.GONE);
                iv_player_simle_full.setImageResource(R.drawable.war_pause_smile);
            } else {
                iv_play_big_full.setVisibility(View.VISIBLE);
                iv_play_big_full.setImageResource(R.drawable.war_player);
                iv_player_simle_full.setImageResource(R.drawable.war_palyer_simle);
                mPlayer.setVideoSurface(FullmHolder.getSurface());
                mPlayer.play();
                mHandler.sendEmptyMessageDelayed(PAUSEPLAY, 150);
            }
            ISFULLSCREEN = true;
            rl_full.setVisibility(View.VISIBLE);
            sv_full_view.setVisibility(View.VISIBLE);
            surface_view.setVisibility(View.GONE);
            rl_head.setVisibility(View.GONE);
            sL_content.setVisibility(View.GONE);
            hideActionBar();
            mHandler.sendEmptyMessageDelayed(FULLSEEKGONE, 3000);
            LogUtils.e("onConfigurationChanged进入了方法surfaceCreated :+" + ISFULLSCREEN);
        } else {
            if (mPlayer.isPlaying()) {
                iv_play_big.setVisibility(View.GONE);
                iv_player_simle.setImageResource(R.drawable.war_pause_smile);
            } else {
                iv_play_big.setVisibility(View.VISIBLE);
                iv_play_big.setImageResource(R.drawable.war_player);
                mPlayer.setVideoSurface(mHolder.getSurface());
                mPlayer.play();
                mHandler.sendEmptyMessageDelayed(PAUSEPLAY, 100);
            }
            iv_play_big_full.setVisibility(View.GONE);
            ISFULLSCREEN = false;
            rl_head.setVisibility(View.VISIBLE);
            sL_content.setVisibility(View.VISIBLE);
            rl_full.setVisibility(View.GONE);
            sv_full_view.setVisibility(View.GONE);
            surface_view.setVisibility(View.VISIBLE);
            showActionBar();
            LogUtils.e("onConfigurationChanged进入了方法surfaceCreated :+" + ISFULLSCREEN);
        }
    }

这里写的比较乱,主要是需求一直变 就没有改,大概就是一些横屏竖屏一些显示隐藏的操作。

特别注意mPlayer.setVideoSurface(FullmHolder.getSurface());每次切换时要重新绑定你要使用的surfaceview,还有surfaceview的显示隐藏得单独来处理,隐藏父类布局是没有用得。

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // 手动竖屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); // 手动横屏

最后附上手动横竖屏方法 ,记得在mainfest.xml文件中配置activity

android:configChanges="orientation|keyboardHidden|screenSize"

当然我这种方法可能只是适应单个页面单个视频,如果你的视频列表recyclerView 来滚动切换全屏得可能需要别的办法,我还没有试。据说会有显示错位的问题。

了解还有使用fragment来实现切换全屏的操作,听起来更靠谱些,不知道哪位有没有相关实践过。

相关文章

网友评论

      本文标题:android使用阿里云sdk播放器 实现切换全屏播放

      本文链接:https://www.haomeiwen.com/subject/dhmzoctx.html