上一篇介绍了智能厨房重构-使用Bmob后端云实现朋友圈,基本上将Bmob上面的功能都使用到了,今天介绍一点不一样的东西,老学一样的东西也容易视觉疲劳,今天给大家介绍一个Vitamio这个视频播放框架,因为想实现视频教学的功能,在网上找了找去,发现这个框架兼容性很高,支持很多格式的视频编码,最关键的是我们中国人自己开发的视频框架,必须支持。好,下面我介绍一下使用的方法。
1. 环境配置
首先给一下github地址:https://github.com/yixia/VitamioBundle,将这个项目clone下来,可以看到如下的文件目录
将里面的vitamio作为module引入到你的project中,并将它作为你的依赖library。
还有一个很关键的一点,将vitamio-sample中的vitamio-sample\res\raw下的raw文件夹复制一份到你的app的res目录下面,因为里面有一个重要的libarm.so文件。
1.1 初始化工作
在manifest中添加申明:
<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 onCreate中 setContentView()之前添加解码监听判断
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (!io.vov.vitamio.LibsChecker.checkVitamioLibs(this))
return;
setContentView(R.layout.activity_play);
}
2. 在bomb上面放置视频文件
因为国内的视频播放大哥们都比较抠门,根本不可能获取到他们的视频资源,就算有点资源还有一分钟的广告,求人不如求己,我就自己搞一个视频资源库吧!
我放了十几遍小清新的视频教学,哈哈,没事看看还不错。
3. 实战
**
* 作者:GXL on 2016/8/3 0003
* 博客: http://blog.csdn.net/u014316462
* 作用:美食教学视频Item
*/
public class FoodTeachVideo extends BmobObject{
public String getFoodname() {
return foodname;
}
public void setFoodname(String foodname) {
this.foodname = foodname;
}
public BmobFile getFoodvideo() {
return foodvideo;
}
public void setFoodvideo(BmobFile foodvideo) {
this.foodvideo = foodvideo;
}
String foodname;
BmobFile foodvideo;
}
这是我们服务器端定义的视频教学表,使用视频播放时,首先要获取到视频的URL地址,所以必须先要获取到服务器上面的所有数据。下面是获取的Model
/**
* 作者:GXL on 2016/8/3 0003
* 博客: http://blog.csdn.net/u014316462
* 作用:获取视频列表的model
*/
public class FoodVideoModel implements FoodVideoModelImpl {
/**
* 获取所有的播放视频的列表
*
* @param listener
*/
@Override
public void getGeneralFoodsVideoItem(final FoodModelImpl.BaseListener listener) {
BmobQuery<FoodTeachVideo> query = new BmobQuery<FoodTeachVideo>();
query.findObjects(BaseApplication.getmContext(), new FindListener<FoodTeachVideo>() {
@Override
public void onSuccess(List<FoodTeachVideo> object) {
listener.getSuccess(object);
}
@Override
public void onError(int code, String msg) {
}
});
}
}
获取到视频的URL,就可以开始进行播放工作了。下面先给出播放视频的Activity
/**
* 作者:GXL on 2016/8/3 0003
* 博客: http://blog.csdn.net/u014316462
* 作用:视频教学activity
*/
public class FoodTeachVideoActivity extends Activity {
@Bind(R.id.surface_view)
VideoView surfaceView;
@Bind(R.id.loading)
RelativeLayout loading;
private MyMediaController mMediaController;
private static final int TIME = 0;
private static final int BATTERY = 1;
private String mURL;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case TIME:
mMediaController.setTime(msg.obj.toString());
break;
case BATTERY:
mMediaController.setBattery(msg.obj.toString());
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.foodteachvideo_activity_main);
ButterKnife.bind(this);
mURL = getIntent().getStringExtra("URL");
int flag = WindowManager.LayoutParams.FLAG_FULLSCREEN;
Window window = FoodTeachVideoActivity.this.getWindow();
window.setFlags(flag, flag);
if (!LibsChecker.checkVitamioLibs(this))
return;
surfaceView.setVideoPath(mURL);//设置播放地址
surfaceView.setVideoLayout(VideoView.VIDEO_LAYOUT_STRETCH, 0); //视频全屏
mMediaController = new MyMediaController(this, surfaceView, this);//实例化控制器
mMediaController.show(2000);//控制器显示5s后自动隐藏
surfaceView.setMediaController(mMediaController);//绑定控制器
surfaceView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
loading.setVisibility(View.GONE);
ToastUtils.showLong(FoodTeachVideoActivity.this, "准备好");
surfaceView.start();
}
});
surfaceView.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
ToastUtils.showLong(FoodTeachVideoActivity.this, "播放出错");
finish();
return false;
}
});
surfaceView.start();
surfaceView.setVideoQuality(MediaPlayer.VIDEOQUALITY_MEDIUM);//设置播放画质 中等画质
surfaceView.requestFocus();//取得焦点
registerBoradcastReceiver();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
//时间读取线程
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
String str = sdf.format(new Date());
Message msg = new Message();
msg.obj = str;
msg.what = TIME;
mHandler.sendMessage(msg);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
if (surfaceView != null) {
surfaceView.setVideoLayout(VideoView.VIDEO_LAYOUT_SCALE, 0);
}
super.onConfigurationChanged(newConfig);
}
@Override
protected void onDestroy() {
super.onDestroy();
try {
unregisterReceiver(batteryBroadcastReceiver);
} catch (IllegalArgumentException ex) {
}
}
private BroadcastReceiver batteryBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())) {
//获取当前电量
int level = intent.getIntExtra("level", 0);
//电量的总刻度
int scale = intent.getIntExtra("scale", 100);
//把它转成百分比
//tv.setText("电池电量为"+((level*100)/scale)+"%");
Message msg = new Message();
msg.obj = (level * 100) / scale + "";
msg.what = BATTERY;
mHandler.sendMessage(msg);
}
}
};
public void registerBoradcastReceiver() {
//注册电量广播监听
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(batteryBroadcastReceiver, intentFilter);
}
}
在布局文件中,添加vitamio的播放控件
<io.vov.vitamio.widget.VideoView
android:id="@+id/surface_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true" />
上面因为对MediaController的显示做了自定义,代码看起来有点复杂,其实核心的播放代码就是:
surfaceView.setVideoPath(mURL);//设置播放地址
surfaceView.setVideoLayout(VideoView.VIDEO_LAYOUT_STRETCH, 0); //视频全屏
mMediaController = new MyMediaController(this, surfaceView, this);//实例化控制器
mMediaController.show(2000);//控制器显示5s后自动隐藏
surfaceView.setMediaController(mMediaController);//绑定控制器
surfaceView.start();
surfaceView.setVideoQuality(MediaPlayer.VIDEOQUALITY_MEDIUM);//设置播放画质 中等画质
surfaceView.requestFocus();//取得焦点
使用时,只需要将URL地址换成你的URL地址即可。
4. 效果
详细的项目代码地址:https://github.com/gxl1240779189/ReIntelligentKitchen

本文介绍如何使用Vitamio框架实现智能厨房应用中的视频教学功能,包括环境配置、视频文件放置及播放实战等内容。

1447

被折叠的 条评论
为什么被折叠?



