4.10 Vitamio
来源:互联网 发布:asp.net java 编辑:程序博客网 时间:2024/05/17 05:53
视频框架Vitamio学习
概述
开发公司一个乐视TV项目时,本来有个播放视频广告的功能,到最后不了了之。虽然没有在项目中做要求,但是这个点子还是激起了我研究多媒体的好奇心。刚好后面遇到一款比较喜欢的视频APP魔力盒,上面视频播放的体验及整个产品的设计都是我喜欢的类型,于是反编译了一下,发现其中用到了一个视频框架Vitamio,(还有一个很流畅的下拉刷新框架hardmark), 然后,一番百度google,发现居然是国内团队开发的框架,而且应用已经很广泛。所以研究了下,自己写了个demo。
资料总结
Vitamio官网:https://www.vitamio.org
源码地址:https://github.com/yixia/VitamioBundle
最佳教程:大名鼎鼎的农民伯伯博客http://www.cnblogs.com/over140/category/409230.html,农民伯伯应该是这个开发团队的一员。
VPlayer好像是这个框架的最佳产品,不过看到官网的一些合作伙伴,如果确实是用到这个框架的话,好像也很不错(可以反编译看看,学习学习~)
下面是农名伯伯开发教程实现的产品的源码(下载测试后,可以运行,扫描本地视频好像没找到文件,仔细找下原因应该是可以解决的,项目用到的内容还算是比较常规的吧,没有比较难懂的地方,也可能是我没有研究那么细):
项目地址:http://code.taobao.org/p/oplayer
SVN地址:http://code.taobao.org/svn/oplayer/
总体感觉,初次接触会比较难理解,花点时间去研究的话,还是比较好懂的,这个框架发展了这么久,现在算是比较成熟了。目前还是面向个人开发者免费。如果有需要的话,可以引用。
资料引用
iteye上面有几篇
相关知识点
项目中有个获取视频缩略图的功能,在VPlayer的源码中好像注释掉了,从API 8开始,现有Android API里面就有了一个用于实现相关功能的类
android.media.ThumbnailUtils这个类提供了3个静态方法一个用来获取视频第一帧得到的Bitmap,2个对图片进行缩略处理。
publicstatic Bitmap createVideoThumbnail (String filePath, int kind)
第一个参数是视频文件的路径,第二个参数是指定图片的大小,有两种选择Thumbnails.MINI_KIND与Thumbnails.MICRO_KIND。
- 第一种文档上说大小是512 x 384 ,我用一个MP4格式文件测试得到544 x 960,用一个wmv格式文件测试得到160 x 120。明显不靠谱。
- 第二种参数两种格式文件得到的大小都是 96 x 96,这个才是缩略图。
extractThumbnail(Bitmap source, int width, int height, int options)extractThumbnail(Bitmap source, int width, int height)
这两种方法都是用来处理Bitmap的大小的,第一个参数是要处理的Bitmap,第二个参数是处理后宽度,第三个是高度,第四个参数options,如果options定义为OPTIONS_RECYCLE_INPUT,则回收资源。也就是说可以用第三种方法把截取到的视频第一帧的Bitmap转成任意想要的大小,第三个方法还可以获取内存卡内图片的缩略图。
Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(path1, Thumbnails.MINI_KIND); bitmap = ThumbnailUtils.extractThumbnail(bitmap, 210, 210);
从API 10开始新增一类MediaMetadataRetriever可以用来获取媒体文件的信息
MediaMetadataRetriever mmr = new MediaMetadataRetriever(); mmr.setDataSource("/sdcard/33.mp4"); Bitmap bitmap = mmr.getFrameAtTime(); image.setImageBitmap(bitmap); System.out.println(mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DATE)+""); System.out.println(mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE)+""); mmr.release();
MediaMetadataRetriever可以获取视频任何一帧的缩略图。
publicstatic Bitmap createVideoThumbnail(String filePath) { // MediaMetadataRetriever is available on API Level 8 // but is hidden until API Level 10 Class<?> clazz = null; Object instance = null; try { clazz = Class.forName("android.media.MediaMetadataRetriever"); instance = clazz.newInstance(); Method method = clazz.getMethod("setDataSource", String.class); method.invoke(instance, filePath); // The method name changes between API Level 9 and 10. if (Build.VERSION.SDK_INT <= 9) { return (Bitmap) clazz.getMethod("captureFrame").invoke(instance); } else { byte[] data = (byte[]) clazz.getMethod("getEmbeddedPicture").invoke(instance); if (data != null) { Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); if (bitmap != null) return bitmap; } return (Bitmap) clazz.getMethod("getFrameAtTime").invoke(instance); } } catch (IllegalArgumentException ex) { // Assume this is a corrupt video file } catch (RuntimeException ex) { // Assume this is a corrupt video file. } catch (InstantiationException e) { Log.e(TAG, "createVideoThumbnail", e); } catch (InvocationTargetException e) { Log.e(TAG, "createVideoThumbnail", e); } catch (ClassNotFoundException e) { Log.e(TAG, "createVideoThumbnail", e); } catch (NoSuchMethodException e) { Log.e(TAG, "createVideoThumbnail", e); } catch (IllegalAccessException e) { Log.e(TAG, "createVideoThumbnail", e); } finally { try { if (instance != null) { clazz.getMethod("release").invoke(instance); } } catch (Exception ignored) { } } returnnull; }
- 4.10 Vitamio
- Vitamio
- Vitamio
- Vitamio
- Vitamio 是什么?Vitamio 新手入门
- 4.10 Vitamio 快速导入androidstudio中和简单使用
- Vitamio FAQ
- Vitamio介绍
- Vitamio FQA
- Vitamio 视频
- vitamio介绍
- 学习vitamio
- vitamio使用
- 导入 Vitamio
- vitamio简述
- vitamio导入
- Vitamio工程建立
- android播放器Vitamio
- Android 系统属性SystemProperty分析
- java文件路径的不同写法
- Android打开或者关闭软键盘的解决方案
- windows下mysql5.6 表名自动变小写问题
- QT中布局器的addStretch函数使用效果1
- 4.10 Vitamio
- 进程间通信与线程间通信 . windows下多线程通信方法 Linux 多线程通信
- Web应用笔记
- hibernate中的关联cascade
- Android 数据存储之文件存储
- Android gradle 入门
- Android4.2锁屏流程【Android锁屏解析三】
- mybatis使用group by返回sum,count数据
- oracle之 any、all 解析