智能厨房重构-使用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

0 0