Android Studio 导入 Vitamio及横竖屏切换

简介: 建议不要使用Vitamio,各种深坑 https://github.com/Bilibili/ijkplayer看看bilibili的开源播放器Vitamio官方:https://www.vitamio.org/ GitHub:https://github.com/yixia/VitamioBundle Vitamio 能够流畅播放720P甚至10

建议不要使用Vitamio,各种深坑

https://github.com/Bilibili/ijkplayer看看bilibili的开源播放器

Vitamio

官方:https://www.vitamio.org/
GitHub:https://github.com/yixia/VitamioBundle

Vitamio 能够流畅播放720P甚至1080P高清MKV,FLV,MP4,MOV,TS,RMVB等常见格式的视频,支持 MMS, RTSP, RTMP, HLS(m3u8) 等常见的多种视频流媒体协议,包括点播与直播。

1.下载Vitamio

去官网下载即可


2.解压并导入Android

  • 找到到文件夹VitamioBundle

    VitamioBundle

  • File > New > New Module
    这里写图片描述

  • 导入完成后是这样的

    这里写图片描述

3.导入到自己的项目(即不使用Vitamio的libiary,强迫症专属)

这里写图片描述

A.在自己的目录下建立io.vov.vitamio

并导入所有的类,以及将jniLibs目录拷贝到main目录下,还有相关的资源文件

B.在AndroidManifest.xml文件中写入

<activity 
android:name="io.vov.vitamio.activity.InitActivity"             android:configChanges="orientation|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation"
android:launchMode="singleTop"
android:theme="@android:style/Theme.NoTitleBar"
android:windowSoftInputMode="stateAlwaysHidden"/>

并加入相应的权限

C.在你喜欢的地方初始化Vitamio

开玩笑的,放在activity或者是Application的onCreate中

Vitamio.isInitialized(application.getApplicationContext());


3.Vatimio的使用

A.界面的搭建

这里写图片描述

可以看到
整个页面主要分上下两层,主要是为了视屏全屏的时候能方便的隐藏整个下面的布局

B.使用

在此之前为了方便的使用视屏全屏播放,对MediaController(package io.vov.vitamio.widget)做一个小小的改造:
添加一个构造:主要用于把视屏,进度条等放到一个View中,便于全屏展示

//这个全屏的操作可把我难坏了,看到这个真的是为原作者的机智点赞
  public MediaController(Context context,boolean fromXml,View container) {
    super(context);
    initController(context);
    mFromXml = fromXml;
    mRoot = makeControllerView();
    //这个地方的FrameLayout.LayoutpParams是因为布局文件中要把MediaController的视图作为childView加到一个FrameLayout中去
    LayoutParams p = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
    //想怎样布局MediaController就尽情的发挥这个LayoutParams吧
    p.gravity = Gravity.BOTTOM;
    mRoot.setLayoutParams(p);
    ((FrameLayout)container).addView(mRoot);
  }

接着你就可以愉快的玩耍了:
在oncreate中调用

  initVitamioView();
//初始化控件
private void initVitamioView() {
//VideoView
mVideoView = (VideoView) findViewById(R.id.buffer);
//这个就是包裹整个视屏模块的FrameLayout
fl_controller = (FrameLayout) findViewById(R.id.fl_controller);
//缓冲时出现的进度条
pb = (ProgressBar) findViewById(R.id.probar);
//播放进度,并可以拖动调节视屏播放位置
downloadRateView = (TextView) findViewById(R.id.download_rate);
loadRateView = (TextView) findViewById(R.id.load_rate);
//设置视屏setVideoURI可以缓冲并播放
//setVideoPath()缓冲完再播放
mVideoView.setVideoURI(Uri.parse(TextUtils.isEmpty(path)?defaultPath:path));
//这里使用自定义的那个MediaController构造
mMediaController= new MediaController(this, true, fl_controller);
//这里的监听其实是在MediaController中自己定义的,主要就是全屏的切换按钮
mMediaController.setOnControllerClick(new MediaController.OnControllerClick() {
     @Override
     public void OnClick(int type) {
         if (type == 0) {  //表示点击切换全屏按钮
              if (isPortrait) {
                  //不是全屏,切换为全屏
                 //代码块1
               } else {
                  //是全屏,近来就切为原来的大小
                 //代码块2
               }
          }
          }
        });

//类似绑定 
mVideoView.setMediaController(mMediaController);
//隐藏控制模块
mMediaController.setVisibility(View.GONE);
mVideoView.requestFocus();
//设置对视屏信息的监听
mVideoView.setOnInfoListener(this);
//视屏缓冲的监听
mVideoView.setOnBufferingUpdateListener(this);
//视屏OK
mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
     @Override
     public void onPrepared(MediaPlayer mediaPlayer) {
         //设置播放速度
         mediaPlayer.setPlaybackSpeed(1.0f);
            }
        });
    }

补充代码块1

RelativeLayout.LayoutParams fl_lp = new RelativeLayout.LayoutParams(displayheight, displayWidth);
                        fl_controller.setLayoutParams(fl_lp);
//设置横屏                        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);  //这样mVideoView会自己充满全屏
                        mVideoView.setVideoLayout(VideoView.VIDEO_LAYOUT_SCALE, 0);
                        isPortrait = false;

代码块2

RelativeLayout.LayoutParams fl_lp = new RelativeLayout.LayoutParams(
                                LinearLayout.LayoutParams.MATCH_PARENT,
                                DensityUtils.dip2px(ClassRoomActivity.this,200)
                        );
                        fl_controller.setLayoutParams(fl_lp);
                        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                        isPortrait = true;
/*
 * 横竖屏切换的时候回走这个回调
 *
 */
@Override
public void onConfigurationChanged(Configuration newConfig) {
        //屏幕切换时,设置全屏
        if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
            //隐藏下面的布局和标题
            tLBelow.setVisibility(View.GONE);
            mTitlebar.setVisibility(View.GONE);
        }
        if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
             //显示下面的布局和标题
            tLBelow.setVisibility(View.VISIBLE);
            mTitlebar.setVisibility(View.VISIBLE);
        }

        super.onConfigurationChanged(newConfig);
    }

C.两个重要的监听(上面已经注册过了)

//缓冲的监听
@Override
    public void onBufferingUpdate(MediaPlayer mp, int percent) {
    //显示缓冲进度
        loadRateView.setText(percent + "%");
    }
//视屏信息监听
@Override
    public boolean onInfo(MediaPlayer mp, int what, int extra) {
        switch (what) {
        //开始缓冲
            case MediaPlayer.MEDIA_INFO_BUFFERING_START:
                if (mVideoView.isPlaying()) {
                    mVideoView.pause();
                    pb.setVisibility(View.VISIBLE);
                    downloadRateView.setText("");
                    loadRateView.setText("");
                    downloadRateView.setVisibility(View.VISIBLE);
                    loadRateView.setVisibility(View.VISIBLE);
                }
                break;
                //停止缓冲,这里自动开始播放
            case MediaPlayer.MEDIA_INFO_BUFFERING_END:
                mVideoView.start();
                pb.setVisibility(View.GONE);
                downloadRateView.setVisibility(View.GONE);
                loadRateView.setVisibility(View.GONE);
                break;
            case MediaPlayer.MEDIA_INFO_DOWNLOAD_RATE_CHANGED:
                //缓冲的...那个啥    change
                downloadRateView.setText("" + extra + "kb/s" + "  ");
                break;
        }
        return true;
    }

4.就这样

对了,完事记得

@Override
    protected void onDestroy() {
            mVideoView.stopPlayback();
           super.onDestroy();
    }

基本就是这样了,其他的问题自己解决一下就好了…

相关文章
|
3月前
|
人工智能 IDE 开发工具
Studio Bot - 让 AI 帮我写 Android 代码
Studio Bot - 让 AI 帮我写 Android 代码
150 1
|
4月前
|
XML Java Android开发
Android Studio App开发之对图片进行简单加工(包括放缩,旋转等等 附源码)
Android Studio App开发之对图片进行简单加工(包括放缩,旋转等等 附源码)
44 0
|
4月前
|
XML Java Android开发
Android Studio App开发中使用录音机、MediaRecorder录制音频和MediaPlayer播放音频讲解及实战(附源码)
Android Studio App开发中使用录音机、MediaRecorder录制音频和MediaPlayer播放音频讲解及实战(附源码)
72 0
|
4月前
|
Java 开发工具 Android开发
OpenCV(一):Android studio jni配置OpenCV(亲测有效,保姆级)
OpenCV(一):Android studio jni配置OpenCV(亲测有效,保姆级)
156 0
|
2月前
|
数据库 Android开发 数据库管理
【Android】使用android studio查看内置数据库信息
【Android】使用android studio查看内置数据库信息
60 0
|
2月前
|
编译器 开发工具 Android开发
|
2月前
|
Android开发
【Android Studio】小游戏 | 实现两个小动物随手指移动
【Android Studio】小游戏 | 实现两个小动物随手指移动
|
2月前
|
Android开发 数据安全/隐私保护
【Android Studio】简单的QQ登录界面
【Android Studio】简单的QQ登录界面
|
3月前
|
IDE 开发工具 Android开发
Android Studio 下发布项目成APK文件
Android Studio 下发布项目成APK文件
117 1
|
3月前
|
前端开发 Java 数据库
用android studio写一个简单的记单词?????App
用android studio写一个简单的记单词?????App
20 0