工作内容:

准备工作【集成Vitamio】

1.使用Vitamio框架中的VideoView,MediaController播放本地视频和网络视频

2.使用Vitamio的MediaPlayer+SurfaceView(用于得到SurfaceHolder)来播放视频

3.自定义MediaController,让其播放控制栏更好用【可以放其他的控件来控制VideoView的播放状态】

【注意:使用前需先执行vitamio的初始化操作【Vitamio.initialize(this)】】

学习分享:

使用Vitamio的原因是:Vitamio能够解析很多格式的视频(MKV,FLV,MP4,MOV,TS,RMVB,MMS, RTSP, RTMP, HLS(m3u8) 等常见的多种视频流媒体协议,包括点播与直播),而我们系统自带的VideoView仅可以播放MP4,,3GP格式的视频。

【集成Vitamio】

1.在github上下载/clone“vitamio”地址:https://github.com/yixia/VitamioBundle

2.将VitamioBundle解压后,通过new —— import Module导入vitamio文件夹【出错,修改build.gradle中的compileSdkVersion,buildToolsVersion与你常用的一致即可】导入成功。

3.将vitamio添加为你原来的app的Module依赖,完成即可使用。


一、使用Vitamio框架中的VideoView,MediaController播放本地视频和网络视频

1.java代码:

import android.net.Uri;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import java.io.File;
import io.vov.vitamio.MediaPlayer;
import io.vov.vitamio.Vitamio;
import io.vov.vitamio.widget.MediaController;
import io.vov.vitamio.widget.VideoView;

public class Demo_5_Activity extends AppCompatActivity {
    private VideoView videoView;
    private TextView tvProgress;
    private TextView tvDownloadSpeed;
    private String urlString = "http://112.253.22.157/17/z/z/y/u/zzyuasjwufnqerzvyxgkuigrkcatxr/hc.yinyuetai.com/D046015255134077DDB3ACA0D7E68D45.flv";
    private MediaController controller;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_demo_5_);
        File file = Environment.getExternalStorageDirectory();
        File file1 = new File(file,"a11.mp4");
        //判断Vitamio是否已经初始化【并且初始化】
        if (Vitamio.initialize(this)) {
            videoView = (VideoView) findViewById(R.id.vitamio);
//            videoView.setVideoURI(Uri.parse(urlString));//播放网络视频
            videoView.setVideoPath(file1.getPath());//播放本地视频
            controller = new MediaController(this);//视频控制器
            videoView.setMediaController(controller);//关联控制器
            videoView.start();
        }
        initView();
        setListener();
    }
    private void setListener() {
        //设置缓冲进度的监听
        videoView.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {
            @Override
            public void onBufferingUpdate(MediaPlayer mp, int percent) {
                tvProgress.setText(percent + "%");
            }
        });
        //设置缓冲下载监听
        videoView.setOnInfoListener(new MediaPlayer.OnInfoListener() {
            @Override
            public boolean onInfo(MediaPlayer mp, int what, int extra) {
                switch (what) {
                    //开始缓冲
                    case MediaPlayer.MEDIA_INFO_BUFFERING_START://开始缓冲时的视图变化
                        tvProgress.setVisibility(View.VISIBLE);
                        tvDownloadSpeed.setVisibility(View.VISIBLE);
                        mp.pause();
                        break;
                    //缓冲结束
                    case MediaPlayer.MEDIA_INFO_BUFFERING_END://缓冲好后的视图变化(可播放)
                        tvProgress.setVisibility(View.GONE);
                        tvDownloadSpeed.setVisibility(View.GONE);
                        mp.start();
                        break;
                    //正在缓冲
                    case MediaPlayer.MEDIA_INFO_DOWNLOAD_RATE_CHANGED:
                        tvDownloadSpeed.setText("当前网速:" + extra + "kb/s");//下载是速度
                        break;
                }
                return true;
            }
        });
        //设置准备监听(判断一准备好播放)
        videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                videoView.setBufferSize(512*1025);//设置缓冲区大小
            }
        });
    }

    private void initView() {
        tvProgress = (TextView) findViewById(R.id.tv_progress_home);
        tvDownloadSpeed = (TextView) findViewById(R.id.tv_download_home);
    }
}

2.对应xml代码:


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_demo_4_2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="read.liu.com.wait.Demo_5_Activity">
    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:id="@+id/relativeLayout">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            >
            <io.vov.vitamio.widget.VideoView
                android:id="@+id/vitamio"
                android:layout_width="match_parent"
                android:layout_height="200dp"
                android:layout_gravity="center"
                />
        </LinearLayout>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="5%"
            android:textColor="@color/white"
            android:layout_margin="10dp"
            android:id="@+id/tv_progress_home"
            />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="200kb/s"
            android:id="@+id/tv_download_home"
            android:layout_alignBaseline="@+id/tv_progress_home"
            android:textColor="@color/white"
            android:layout_margin="10dp"
            android:layout_toRightOf="@+id/tv_progress_home"
            />
    </RelativeLayout>
</RelativeLayout>

演示效果:

Android第三方视频组件 android 视频播放框架_xml

Android第三方视频组件 android 视频播放框架_android_02

二、使用Vitamio的MediaPlayer+SurfaceView(用于得到SurfaceHolder)来播放视频

java代码:

import java.io.IOException;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import io.vov.vitamio.MediaPlayer;
import io.vov.vitamio.Vitamio;
import io.vov.vitamio.utils.Log;
import read.liu.com.videoplayer.R;

public class MediaActivity extends AppCompatActivity {
    private long playTime = 0;
    private MediaPlayer mediaPlayer;
    private SurfaceHolder surfaceHolder;
    private String urlString = "http://112.253.22.157/17/z/z/y/u/zzyuasjwufnqerzvyxgkuigrkcatxr/hc.yinyuetai.com/D046015255134077DDB3ACA0D7E68D45.flv";
    private boolean isPlay = false; //用于记录是否在播放
    @BindView(R.id.sf_media)
    SurfaceView sfMedia;
    @BindView(R.id.ib_play_media)
    ImageButton ibPlayMedia;
    @BindView(R.id.pb_media)
    SeekBar pbMedia;
    @BindView(R.id.ib_fullscreen_media)
    ImageButton ibFullscreenMedia;
    private int progress1 = 1;
    private Uri uri;
    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            pbMedia.setProgress(progress1);
            if((playTime-progress1*1000)<=1000){
                Log.e("-----------","播放结束");
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_media);
        ButterKnife.bind(this);
        Vitamio.initialize(this);//初始化Vitamio
        init();
    }

    private void init() {
        //关联mediaplayer和surfaceView
        surfaceHolder = sfMedia.getHolder();
        surfaceHolder.setFormat(PixelFormat.RGBA_8888);//设置播放的清晰度(像素格式)
        mediaPlayer = new MediaPlayer(MediaActivity.this);
        mediaPlayer.setLooping(false);
        uri = Uri.parse(urlString);
        surfaceHolder.addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                try {
                    mediaPlayer.setDisplay(surfaceHolder);//关联mediaplayer和surfaceview
                    mediaPlayer.setDataSource(MediaActivity.this, uri);//设置播放数据源
                    mediaPlayer.prepareAsync();//异步准备
                    //异步准备监听
                    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                        @Override
                        public void onPrepared(MediaPlayer mp) {
                            playTime = mediaPlayer.getDuration();
                            pbMedia.setMax((int)playTime/1000);//设置seekbar的最大值
                            isPlay = true;
                            mediaPlayer.start();
                            startTimeTast();
                            ibPlayMedia.setImageResource(read.liu.com.wait.R.drawable.ic_adjust_black_24dp);
                        }
                    });
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

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

            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {

            }
        });
        mediaPlayer.setOnInfoListener(new MediaPlayer.OnInfoListener() {
            @Override
            public boolean onInfo(MediaPlayer mp, int what, int extra) {
                switch (what) {
                    //开始缓冲
                    case MediaPlayer.MEDIA_INFO_BUFFERING_START://开始缓冲时的视图变化
                        mp.pause();
                        break;
                    //缓冲结束
                    case MediaPlayer.MEDIA_INFO_BUFFERING_END://缓冲好后的视图变化(可播放)
                        mp.start();
                        break;
                    //正在缓冲
                    case MediaPlayer.MEDIA_INFO_DOWNLOAD_RATE_CHANGED:
                        break;
                }
                return true;
            }
        });
        //添加拖动条监听事件
        pbMedia.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                //判断是用户拖动进度条产生的改变
                if(fromUser){
                    mediaPlayer.seekTo(seekBar.getProgress()*1000);
                    progress1 = progress;
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }
            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {


            }
        });

    }

    private void startTimeTast() {
        new Thread(){
            @Override
            public void run() {
                while (isPlay){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    handler.sendEmptyMessage(0);
                    progress1++;
                }
            }
        }.start();
    }

    @OnClick({R.id.ib_play_media, R.id.pb_media})
    public void onClick(View view) {
        switch (view.getId()) {
            //点击了播放/暂停按钮
            case R.id.ib_play_media:
                if (isPlay) {
                    ibPlayMedia.setImageResource(read.liu.com.wait.R.drawable.ic_adjust_black_24dp);
                    mediaPlayer.pause();
                    isPlay = false;
                } else {
                    ibPlayMedia.setImageResource(read.liu.com.wait.R.drawable.ic_play_arrow);
                    mediaPlayer.start();
                    isPlay = true;
                }
                startTimeTast();
                break;
            case R.id.pb_media:

                break;
        }
    }
    //退出后注销mediapalyer
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mediaPlayer != null) {
            mediaPlayer.stop();
            mediaPlayer.release();
        }
    }

    @OnClick(R.id.ib_fullscreen_media)
    public void onClick() {
        //点击全屏按钮——将播放参数传入下一个全屏的界面
    }
}