您的位置:首页 > 移动开发 > Android开发

Android 视频播放器vitamio框架

2017-04-11 10:18 204 查看

项目简介:

该项目为视频播放器,使用Vitamio框架完成。

vitamio框架下载地址:到这里去

另外,使用Android原生的VideoView播放视频请 参考

使用SurfaceView+MediaPlayer播放视频请参考

详细介绍:

用户点击按钮后,进入另一个Activity并开始播放视频。无论是用户用home键返回桌面还是用返回键返回上一个Activity,只要该应用程序所在进程没有被杀死,在此进入该视频将继续接着上次位置开始播放

该应用涉及到的知识有:

1.vitamio 框架

vitamio 是封装了FFMPEG的视频播放框架,对外提供的接口全部都是java API。该框架使用用法类似与VideoView,该框架最大的好处是方法名几乎与VideoView一样

注意该框架给的并不是一个jar包,而是一个类库。

2.如何让自己的项目关联类库:

注意:

1.相关的视频框架还有百度媒体云,但是我没用过

2.使用vitamio框架,一定要在清单文件中注册vitamio中的Activity

<activity android:name="io.vov.vitamio.activity.InitActivity"></activity>


如果没有添加这一句,可能会出现这样的错误

Caused by: android.content.ActivityNotFoundException: Unable to find explicit activity class {hhh.exercise.smultimedia/io.vov.vitamio.activity.InitActivity}; have you declared this activity in your AndroidManifest.xml?


步骤:

1.首先要把vitamio框架导入到Eclipse中(框架下载地址请看项目简介上,有地址)

首先就是与导入普通的Android项目,一样,点击Eclipse中的 File –》Import –》Existing Project into Workspace –》Browse  ,然后选中vitamio_lib,点击finish。然后点击Vitamio,鼠标右键后点击properties,选中is Library的钩即可



2.创建一个Android项目,然后让自己的项目关联类库

点击自己的项目,然后点击鼠标右键,点击properties,选中Android,点击add按钮,选中vitamio_lib,点击ok,关联类库就完成了。



2.创建两个布局文件。

第一个布局文件为activity_main.xml,这个布局文件十分简单,只有一个按钮:

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

public void click(View v) {
Intent it = new Intent(this, ThirdActivity.class);
startActivity(it);
}
}


第二个布局文件为activity_third.xml,里面只有一个VideoView控件,用来播放视频。注意这里的VideoView是vatimio自定义的控件,而不是android的原生控件,所以要加上包名:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<io.vov.vitamio.widget.VideoView
android:id="@+id/vvv"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

</LinearLayout>


3.编写Activity代码

首先是MainActivity的代码,这个Activity只有一个作用,那就是跳转到视频播放界面:

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

public void click(View v) {
Intent it = new Intent(this, ThirdActivity.class);
startActivity(it);
}
}


然后是ThirdActivity的代码,这个Activity就是控制视频的播放的:

import java.io.File;

import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.widget.Toast;
import android.view.Window;
import android.view.WindowManager;
import io.vov.vitamio.LibsChecker;
import io.vov.vitamio.MediaPlayer;
import io.vov.vitamio.MediaPlayer.OnCompletionListener;
import io.vov.vitamio.widget.MediaController;
import io.vov.vitamio.widget.VideoView;

/**
* @author HHH
*
*/
public class ThirdActivity extends Activity {

private VideoView vvv;
private MediaController mc;
private static long thirdCurrentPosition;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// 隐藏标题栏
requestWindowFeature(Window.FEATURE_NO_TITLE);

// 设置横屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

// 设置全屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

setContentView(R.layout.activity_third);

final File file = new File(Environment.getExternalStorageDirectory().getPath(), "s2.mkv");

// 检测是否支持vitamio引擎是否安装.因为该框架内置了FFMPEG,他是自己调用C语言作视频的编解码,需要硬件的支持。如果硬件不支持,无法编码
// 如果vitamio引擎没有安装,则自动安装,若安装不来,就结束程序
// vitamio引擎检测是需要配置一个Activity:io.vov.vitamio.activity.InitActivity,因为检测是在该Activity中做的
if (!LibsChecker.checkVitamioLibs(this)) {
return;
}

vvv = (VideoView) findViewById(R.id.vvv);

mc = new MediaController(this);

// 指定要播放的视频
vvv.setVideoPath(file.getPath());

SurfaceHolder surfaceHolder = vvv.getHolder();

surfaceHolder.addCallback(new Callback() {

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
Log.i("HHH", "销毁");
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
if (file.exists()) {
// 设置要播放的视频
vvv.setVideoPath(file.getPath());

// 设置VideoView与MediaController相关联
vvv.setMediaController(mc);

// 设置VideoView获取焦点
vvv.requestFocus();

// 开始播放视频(如果上次有播放记录,接着上次播放)
vvv.start();
vvv.seekTo(thirdCurrentPosition);

} else {
Toast.makeText(getApplicationContext(), "视频不存在", 0).show();
}

}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Log.i("HHH", "改变");

}
});

// 播放完毕后,重新开始播放
vvv.setOnCompletionListener(new OnCompletionListener() {

@Override
public void onCompletion(MediaPlayer mp) {
mp.seekTo(0);
mp.start();
}
});

}

// 当Activity退出界面(无论Activity是否销毁了),记录当前视频播放进度
@Override
protected void onPause() {
if (vvv.isPlaying()) {
thirdCurrentPosition = vvv.getCurrentPosition();
vvv.pause();
vvv.suspend();
}
super.onPause();
}

}


4.清单文件

首先要在清单文件中注册Activity

<activity android:name=".ThirdActivity" >
</activity>
<activity android:name="io.vov.vitamio.activity.InitActivity"></activity>


添加权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />


5.部署一下,看看效果

进入该应用,点击按钮看个片压压惊



这是视频格式是mkv的,原生的VideoView是无法播放的,而vatimio框架是可以播放的

点击一下屏幕,出现控制栏



点击SeekBar(即进度条)到任意位置,都会找到那个位置进行播放

直接按手机home键或者返回键返回,下次进入界面都会继续播放。但是一定整个应用的进程没有背杀死。

但是,也有一点要注意,如果频繁的使用home键,然后在点进来,会出现一个bug,视频无法播放,只有彻底杀死这个进程,才能重新播放。

目前这个控制栏是vatimio自带的,功能十分简单,可以自己自定义一个控制栏。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息