智能厨房重构-使用vitamio实现视频播放功能
来源:互联网 发布:淘宝的苏宁易购靠谱吗 编辑:程序博客网 时间:2024/05/12 12:14
上一篇介绍了智能厨房重构-使用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()之前添加解码监听判断
@Overrideprotected 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实现视频播放功能
- 智能厨房重构-使用Bmob后端云实现用户注册登录的功能。
- 智能厨房重构-使用Bmob后端云实现朋友圈的功能
- 智能厨房重构-使用Bmob后端云实现用户注册登录的功能。
- Android 使用Vitamio实现播放视频(一)
- Android 使用Vitamio实现播放视频(一)
- 智能厨房重构-用ActiveAndroid来实现收藏的功能
- Android Vitamio 直播视频播放功能的实现
- Android Vitamio 直播视频播放功能的实现
- vitamio视频播放框架使用
- android使用Vitamio实现视频播放大小屏流畅切换
- 智能厨房重构-项目分包
- 智能厨房重构-MVP架构
- Android视频播放框架Vitamio集成及使用MediaPlayer+SurfaceView、VideoView+MediaController实现播放网络视频
- android视频播放器Vitamio的使用
- 使用vitamio类库播放视频
- 十六,iOS使用Vitamio做视频播放
- 快速使用Vitamio框架播放网络视频
- Openstack nova-scheduler 源码分析 — Filters/Weighting
- iOS正则表达式
- 2568. 【NOIP2011模拟9.17】地铁建设 (StandardIO)
- 面试4-Mysql
- HTML基础2
- 智能厨房重构-使用vitamio实现视频播放功能
- Faster-RCNN训练自己的数据集
- PyCharm在新窗口打开项目
- easyui的datagrid使用小技巧
- HTML基础之标签篇(二)
- c/c++练习--02
- 关于在windows7系统下,win+上下左右组合键失效的问题
- JAVA多态学习笔记
- think in java笔记:RTTI-Runtime type information