智能厨房重构-使用vitamio实现视频播放功能

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

上一篇介绍了智能厨房重构-使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值