Vitamio 是一款 Android 与 iOS 平台上的全能多媒体开发框架,全面支持硬件解码与 GPU 渲染。Vitamio 凭借其简洁易用的 API 接口赢得了全球众多开发者的青睐。到目前,全球已经有超过 一万 种应用在使用 Vitamio,覆盖用户超过 5亿 。

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

    一、vitamio的集成

        1.1 下载vitamio

            到官网的地址https://www.vitamio.org/Download/ 下载最新的vitamio,下载好有2个文件夹要注意:1个vitamio 另一个是vitamio-simple,这2个文件夹后面都要导入到Android studio中

        1.2 导入vitamio

            打开Android,在file----new----import module ,然后路径选择上面提到的vitamio,点确定;

            同样用上面的方法导入vitamio-simple。

            导入的vitamio的build.gradle里面对应的sdk版本不一样,需要你对比自己创建的项目,修改为本地的sdk版本等信息,修改好重新sync project。


        1.3 把vitamio集成到项目中

                1.3.1 关联so库

                        参照vitamio-simple里的build.gradle里的compile里的例子,关联vitamio库,如 

                            compile project(':vitamio')
                1.3.2 把功能清单对应的文件拷贝过去
                        a、权限:
                        <uses-permission android:name="android.permission.WAKE_LOCK" />
                        <uses-permission android:name="android.permission.INTERNET" />
                        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
                        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
                        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
                        <uses-permission android:name="android.permission.READ_PHONE_STATE" />

                        b、配置,这个配置必须不能少,官方也提示了必须加上

                    

                <!-- Don't forgot InitActivity -->
                <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" />
                <activity android:name=".VitamioListActivity" >

        1.4 把我们之前写的SystemVideoPlayer 复制一份,改为VitamioVideoPlayer,里面的包引用vitamio包里的,特别是videoview,mediaplayer 这个类。

        1.5 布局文件 activity_system_video_player.xml复制一份改为activity_vitamio_video_player.xml,里面引用的包也要改为vitamio的类


        1.6 在加载布局文件前,初始化vitamio

wKioL1l291_DxNxfAAC--U_ikdk914.png-wh_50


        1.7 当视频播放出错时,跳转到万能播放器vitamioVideoPlayer播放,并把自定义的这个播放器activity  finish()掉

        

/**
 * 播放出错
 */
class MyOnErrorListener implements MediaPlayer.OnErrorListener {

    @Override
    public boolean onError(MediaPlayer mp, int what, int extra) {
        //出错后,系统会自动提示播放出错,同时自己也弹一个吐司
        //Toast.makeText(SystemVideoPlayer.this,"播放出错",Toast.LENGTH_SHORT).show();
        //播放出错的原因
        //1.播放的视频格式不支持  ----解决办法,跳转到万能播放器去播放
        //1、关闭老的播放器
        //2、把数据传过去
        startVitamioPlayer();

        //2.播放网络视频时,网路中断   -----如果网络确实断了,提示用户网络断了;如果网络断断续续,重新播
        //3.播放的视频中间有空白  -----只能去重新下载
        return true;
    }
}

private void startVitamioPlayer() {
    if (videoview!=null){
        videoview.stopPlayback();
    }
    Intent intent=new Intent(this, VitamioVideoPlayer.class);
    if(medialist!=null&&medialist.size()>0){

        Bundle bundle=new Bundle();
        bundle.putSerializable("mediallist",(ArrayList<MediaItem>)medialist);
        intent.putExtras(bundle);
        intent.putExtra("position",position);  //将点击的视频的位置传过去,方便定位播放的是哪个视频

    }else if (uri!=null){
        intent.setData(uri);
    }

    startActivity(intent);
    finish();

}

1.8 在vitamio万能播放器里,如果播放还是出错,则提示用户,无法播放视频

    

/**
 * 播放出错
 */
class MyOnErrorListener implements MediaPlayer.OnErrorListener {

    @Override
    public boolean onError(MediaPlayer mp, int what, int extra) {
        //出错后,系统会自动提示播放出错,同时自己也弹一个吐司
        Toast.makeText(VitamioVideoPlayer.this,"播放出错",Toast.LENGTH_SHORT).show();
        //播放出错的原因
        //1.播放的视频格式不支持  ----解决办法,跳转到万能播放器去播放
        //2.播放网络视频时,网路中断   -----如果网络确实断了,提示用户网络断了;如果网络断断续续,重新播
        //3.播放的视频中间有空白  -----只能去重新下载

        //万能播放器出错了,那么弹出一个对话框
        showErrrorDialog();
        return true;
    }
}

private void showErrrorDialog() {
    AlertDialog.Builder builder=new AlertDialog.Builder(this);
    builder.setTitle("提示");
    builder.setMessage("播放出错了");
    builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            finish();
        }
    });
    builder.show();

}


二、补充之前播放控制栏里的切换播放器的按钮

    wKiom1l3Vj_QSkTLAAB-_KSC2vA137.jpg-wh_50

    点击后,弹出一个dialog,然后在用户点击确定时,通过intent,把数据传给vitamio播放器,同理,在vitamio里,点击这个把数据传到这个自定义的播放器里。

    

else if ( v == switchPlayer ) {
    // Handle clicks for switchPlayer
    AlertDialog.Builder builder=new AlertDialog.Builder(this);
    builder.setTitle("提示");
    builder.setMessage("当播放画面有花屏时,尝试切换到系统播放器");
    builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            startSystemPlayer();
        }
    });
    builder.setNegativeButton("取消",null);
    builder.show();

}

private void startSystemPlayer() {
    if (videoview!=null){
        videoview.stopPlayback();
    }
    
    Intent intent=new Intent(this, SystemVideoPlayer.class);
    if(medialist!=null&&medialist.size()>0){

        Bundle bundle=new Bundle();
        bundle.putSerializable("mediallist",(ArrayList<MediaItem>)medialist);
        intent.putExtras(bundle);
        intent.putExtra("position",position);  //将点击的视频的位置传过去,方便定位播放的是哪个视频

    }else if (uri!=null){
        intent.setData(uri);
    }

    startActivity(intent);
    finish();

}