Vitamio是一个优秀的视频框架,全面支持硬件解码与 GPU 渲染,下面就来介绍一下如何接入并使用。
1. 导入Vitamio
因为是Android Studio接入,所以直接下载这个库 https://github.com/yixia/VitamioBundleStudio
下载完成后将vitamio目录解压出来
进入vitamio目录,修改build.gradle文件,源文件的 ANDROID_BUILD_SDK_VERSION和ANDROID_BUILD_TOOLS_VERSION 我们是没有配置的,所以需要修改为与自己项目中app/build.gradle一样,不过 targetSdkVersion 需要<=22,兼容某些机型
compileSdkVersion 30
// buildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION
defaultConfig {
minSdkVersion 21
targetSdkVersion 22
}
接下来就可以导入到Android Studio,File - New - Import Module
2. 封装Vitamio
因为需要加一个进度条功能,所以将Vitamio封装起来更方便扩展。
public class VitamioManager {
private static final int PROGRESS = 0x01;
private VideoView mVideoView;
private OnVideoProgressListener mVideoProgressListener;
// 更新进度条
private Handler mHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message msg) {
switch (msg.what) {
case PROGRESS:
if (mVideoProgressListener != null) {
mVideoProgressListener.onProgress(getCurrentPosition());
mHandler.sendEmptyMessageDelayed(PROGRESS, 1000);
}
break;
}
return false;
}
});
// 视频播放进度接口
public interface OnVideoProgressListener {
void onProgress(long progress);
}
public VitamioManager(VideoView mVideoView) {
this.mVideoView = mVideoView;
}
/**
* 设置文件路径
*/
public void setVideoPath(String path) {
mVideoView.setVideoPath(path);
}
/**
* 设置网络路径
*/
public void setVideoURI(Uri uri) {
mVideoView.setVideoURI(uri);
}
/**
* 设置播放速度 [0.5 - 2.0]
*/
public void setPlaybackSpeed(MediaPlayer mediaPlayer, float speed) {
mediaPlayer.setPlaybackSpeed(speed);
}
/**
* 获取当前视频播放的位置
*/
public long getCurrentPosition() {
return mVideoView.getCurrentPosition();
}
/**
* 获取当前视频总长度
*/
public long getDuration() {
return mVideoView.getDuration();
}
/**
* 是否播放
*/
public boolean isPlaying() {
return mVideoView.isPlaying();
}
/**
* 播放
*/
public void start() {
mVideoView.start();
mHandler.sendEmptyMessage(PROGRESS);
}
/**
* 暂停
*/
public void pause() {
mVideoView.pause();
}
/**
* 重新播放
*/
public void resume() {
mVideoView.seekTo(0);
}
/**
* 停止播放 释放资源
*/
public void stopPlayback() {
mVideoView.stopPlayback();
mHandler.removeMessages(PROGRESS);
}
/**
* 从第几毫秒开始播放
*/
public void seekTo(int msec) {
mVideoView.seekTo(msec);
}
/**
* 视频播放完毕的监听
*/
public void setOnCompletionListener(MediaPlayer.OnCompletionListener listener) {
mVideoView.setOnCompletionListener(listener);
}
/**
* 发生错误的监听
*/
public void setOnErrorListener(MediaPlayer.OnErrorListener listener) {
mVideoView.setOnErrorListener(listener);
}
/**
* 视频加载完成的监听
*/
public void setOnPreparedListener(MediaPlayer.OnPreparedListener listener) {
mVideoView.setOnPreparedListener(listener);
}
/**
* 视频进度监听
*/
public void setOnVideoProgress(OnVideoProgressListener listener) {
this.mVideoProgressListener = listener;
}
}
3. 使用
布局
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".MainActivity">
<io.vov.vitamio.widget.VideoView
android:id="@+id/vv_video"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#000"
app:layout_constraintBottom_toBottomOf="parent">
<ImageView
android:id="@+id/iv_control"
android:src="@drawable/mediacontroller_play"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_margin="5dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"/>
<SeekBar
android:id="@+id/sb_bar"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@id/iv_control"
app:layout_constraintRight_toLeftOf="@id/tv_video_time"/>
<TextView
android:id="@+id/tv_video_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:textColor="#fff"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
tools:text="10:30"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
使用前一定要初始化Vitamio
Vitamio.isInitialized(getApplicationContext()); // 初始化Vitamio
接下来设置播放路径,监听视频加载完毕后就播放视频
mVitamioManager = new VitamioManager(mVvVideo);
mVitamioManager.setVideoPath(mVideoPath); // 设置播放路径
// 视频加载完成监听
mVitamioManager.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
Log.i(TAG, "onPrepared: 视频加载完毕");
mVitamioManager.setPlaybackSpeed(mp, 1.0f); // 设置播放速度
long allDuration = mVitamioManager.getDuration(); // 获取视频总时长
mVideoAllDuration = Utils.formatTime(allDuration); // 将视频总时长转换成 h:m:s
mSbBar.setMax((int) allDuration); // 设置进度
mVitamioManager.start(); // 播放视频
setIvControl(false);
}
});
别忘了清理资源
@Override
protected void onDestroy() {
super.onDestroy();
if (mVitamioManager != null) {
mVitamioManager.stopPlayback(); // 停止播放
}
}
其实有个问题,Vitamio在app返回后就会释放相关资源,点回app后就会自动加载资源并重新开始播放视频。还没仔细研究是什么原因造成的,所以没有实现app返回后暂停视频播放,点回app后点击播放按钮再继续播放视频。