Android 使用Vitamio打造自己的万能播放器(10)—— 本地播放 (缩略图、视频信息、视频扫描服务)

前言

Vitamio是我们团队的诚意之作,除了要将VPlayer打造成Android最好的播放器,也要将Vitamio打造成Android最好的播放器组件。新版发布内测SDK虽然还有一些问题,但已经具备高可扩展性、便捷性和许多内置实用的功能,后续文章将继续深挖和介绍Vitamio的使用细节和方法。本章将提供显示缩略图、视频大小等视频信息,并介绍使用Vitamio内置的ContentProvider以及文件扫描服务。

注意

本章ContentProvider在2012-8-31发布的SDK中已经不能使用,后续文章会更新用法。

系列

1、Android 使用Vitamio打造自己的万能播放器(1)——准备  

2、Android 使用Vitamio打造自己的万能播放器(2)—— 手势控制亮度、音量、缩放 

3、Android 使用Vitamio打造自己的万能播放器(3)——本地播放(主界面、视频列表) 

4、Android 使用Vitamio打造自己的万能播放器(4)——本地播放(快捷搜索、数据存储)

5、Android 使用Vitamio打造自己的万能播放器(5)——在线播放(播放优酷视频)

6、Android 使用Vitamio打造自己的万能播放器(6)——在线播放(播放列表)

7、Android 使用Vitamio打造自己的万能播放器(7)——在线播放(下载视频)

8、Android 使用Vitamio打造自己的万能播放器(8)——细节优化

9、Android 使用Vitamio打造自己的万能播放器(9)——在线播放(在线电视)

正文

一、目标

1.1 获取视频缩略图等

之前的文章都是自己扫描获取的视频文件信息,这里补充获取视频缩略图、视频宽带的代码,参加文章2.1部分。

1.2 调用Vitamio的扫描服务

新版SDK已经内置了视频扫描服务,提供了本地视频播放所需的全部数据。

 二、实现

2.1 自己扫描获取视频的缩略图、视频宽高

 public static ArrayList<PFile> batchBuildThumbnail(final Context ctx, final ArrayList<File> files) {
 ArrayList<PFile> result = new ArrayList<PFile>();

 for (File f : files) {
 PFile pf = new PFile();
 try {
 if (f.exists() && f.canRead()) {
 //取出视频的一帧图像
 Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(ctx, f.getAbsolutePath(), Video.Thumbnails.MINI_KIND);
 if (bitmap == null) {
 //缩略图创建失败
 bitmap = Bitmap.createBitmap(ThumbnailUtils.TARGET_SIZE_MINI_THUMBNAIL_WIDTH, ThumbnailUtils.TARGET_SIZE_MINI_THUMBNAIL_HEIGHT, Bitmap.Config.RGB_565);
 Log.e(TAG, "batchBuildThumbnail createBitmap faild : " + f.getAbsolutePath());
 }

 pf.width = bitmap.getWidth();
 pf.height = bitmap.getHeight();

 //缩略图
 bitmap = ThumbnailUtils.extractThumbnail(bitmap, ThumbnailUtils.dipToPX(ctx, ThumbnailUtils.TARGET_SIZE_MICRO_THUMBNAIL_WIDTH), ThumbnailUtils.dipToPX(ctx, ThumbnailUtils.TARGET_SIZE_MICRO_THUMBNAIL_HEIGHT), ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
 if (bitmap != null) {
 File thum = new File(f.getParent(), f.getName() + ".jpg");
 pf.thumb = thum.getAbsolutePath();
 //thum.createNewFile();
 FileOutputStream iStream = new FileOutputStream(thum);
 bitmap.compress(Bitmap.CompressFormat.JPEG, 85, iStream);
 iStream.close();
 }

 if (bitmap != null)
 bitmap.recycle();
 }
 } catch (Exception e) {
 Log.e(TAG, e);
 continue;
 } finally {
 result.add(pf);
 }
 }

 return result;

 }

代码说明:

a). 缩略图的尺寸是可以调整的,大家可以看一下这个默认大小。

b). 这里的代码是缩略图默认存在当前视频路径下面,并且文件名和视频名称一样,多加了一个jpg的后缀。

2.2 调用Vitamio的视频扫描服务

2.2.1  AndroidManifest.xml

 <receiver android:name="io.vov.vitamio.MediaScannerReceiver" >
 <intent-filter>
 <action android:name="android.intent.action.BOOT_COMPLETED" />
 </intent-filter>
 <intent-filter>
 <action android:name="android.intent.action.MEDIA_MOUNTED" />

 <data android:scheme="file" />
 </intent-filter>
 <intent-filter>
 <action android:name="com.yixia.vitamio.action.MEDIA_SCANNER_SCAN_FILE" />
 <action android:name="com.yixia.vitamio.action.MEDIA_SCANNER_SCAN_DIRECTORY" />

 <data android:scheme="file" />
 </intent-filter>
 </receiver>

 <service
 android:name="io.vov.vitamio.MediaScannerService"
 android:exported="false" >
 <intent-filter>
 <action android:name="io.vov.vitamio.IMediaScannerService" />
 </intent-filter>
 </service>

 <service
 android:name="io.vov.vitamio.VitamioService"
 android:exported="false" >
 <intent-filter>
 <action android:name="io.vov.vitamio.IVitamioService" />
 </intent-filter>
 </service>

代码说明:

主要是MediaScannerService服务和MediaScannerReceiver监听器的注册。

2.2.2  启动扫描服务(MainFragmentActivity)

 if (!io.vov.vitamio.LibsChecker.checkVitamioLibs(this, getClass().getName(), R.string.init_decoders, R.raw.libarm))
 return;

 OPreference pref = new OPreference(this);
 //首次运行,扫描SD卡
 if (pref.getBoolean(PREF_KEY_FIRST, true)) {
 getApplicationContext().startService(new Intent(getApplicationContext(), MediaScannerService.class).putExtra(MediaScannerService.EXTRA_DIRECTORY, Environment.getExternalStorageDirectory().getAbsolutePath()));
 pref.putBooleanAndCommit(PREF_KEY_FIRST, false);
 }

代码说明:

OPreference对象封装了SharedPreferences 存储数据。这里判断了是否首次启动应用,是的话启动视频扫描服务。

2.2.3  获取数据(FragmentFile)

private static final String[] PROJECTION_MEDIA = new String[] { Video.Media._ID, Video.Media.TITLE, Video.Media.TITLE_KEY, Video.Media.SIZE, Video.Media.DURATION, Video.Media.DATA, Video.Media.WIDTH, Video.Media.HEIGHT };
 private static final String ORDER_MEDIA_TITLE = Video.Media.TITLE_KEY + " COLLATE NOCASE ASC";

 @Override
 public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
 Log.e(TAG, "onCreateLoader");
 return new CursorLoader(mParent, Video.Media.CONTENT_URI, PROJECTION_MEDIA, null, null, ORDER_MEDIA_TITLE);
 }

 @Override
 public void onLoadFinished(Loader<Cursor> arg0, Cursor newCursor) {
 Log.e(TAG, "onLoadFinished" + newCursor.getCount());
 mAdapter.swapCursor(newCursor);
 mListView.setSelectionFromTop(mVisiablePosition, mVisiableTop);
 }

 @Override
 public void onLoaderReset(Loader<Cursor> arg0) {
 Log.e(TAG, "onLoaderReset");
 mAdapter.swapCursor(null);
 }

代码说明:

a). FragmentFile继承了LoaderCallbacks<Cursor>,相关的资料大家可以搜一下。

b). 其中Video.Media.DATA 存的是视频的路径。

c). 取缩略图的方法:

Video.Thumbnails.getThumbnail(ctx.getApplicationContext(), ctx.getContentResolver(), _id, Video.Thumbnails.MICRO_KIND, null)

这个"_id"就是Video.Media._ID,缩略图存在SD里,大家可以自己加一些缓存处理。

 三、注意事项

3.1 启动视频服务扫描前,需要先确保解码库已经被解压,即调用代码:LibsChecker.checkVitamioLibs

3.2 确保MediaScannerService与当前应用程序在一个进程中,即不要指定其android:process,否则无法使用视频扫描服务。

3.3 目前获取扫描完成广播接收还有问题,即无法获知是否已经扫描完成。目前的办法是每次数据变更后5秒再去判断是否有该Service,没有了就表示已经扫描完成。参见方法MediaScannerReceiver.isServiceRunning。

  解码库

https://bitbucket.org/ABitNo/ffmpegandroid

http://vplayer.net      的首页底部已经给出链接,注意代码并不会实时同步,有需要的朋友可以参考一下。

 四、OPlayer

4.1 下载

请移步#Taocode(SVN):

项目地址:http://code.taobao.org/p/oplayer

SVN地址:http://code.taobao.org/svn/oplayer/

4.2 更新

a). 移动显示SD剩余容量至底部,并在其左边显示正在加载的图标。

b). 保留原FragmentFile为FragmentFildOld,新版已经切换至使用Vitamio内置的视频扫描服务。

c). 更换Adapter为CursorAdapter,同时更新A-Z的功能,参加代码更新。

d). 新增了Preference,用于存储一般设置数据,例如是否首次启动。

五、补充说明

已经在SDK发布版本里面强调了许多,这里再强调一下:

5.1 Vitamio相关项目不能同时存在同一个设备上,也不能与VPlayer共存,这是一个已知的BUG,下一版本会解决。

5.2 Vitamio的示例工程需要在API Level14以上编译,但是最低版本可以支持7以上(android:minSdkVersion="7")。可以把values-v11和values-v14两个文件夹删除,Vitamio在目前项目使用中是兼容Android2.1以上版本,更低的没有试过,大家可以试一下。

5.3 网络视频播放不了、很慢可能有以下几个原因:

a). 你的网速不行

b). 视频服务器不行,或者其带宽不够

c). 可能是播放组件的问题,我们还在持续的改进,加大再网络播放这部分的优化,感谢理解和支持。

遇到这种情况的时候,如果方便请把视频测试地址发给我们,并附上简要说明。(vplayer@yixia.com)

5.4 一直停留在初始化解码包界面的问题

一般出现这种情况,只有一个原因:你的设备上还有其他Vitamio的相关项目,参照5.1。

结束

这篇文章耗费了我至少10个小时以上,昨晚熬到2点,为的是解决使用者心中的疑虑,最终更好的服务于用户。在文档不够全的情况下通过这种方式来与大家分享使用方法和技巧以及注意点,还请大家谅解。

(0)

相关推荐

  • Android中如何获取视频文件的截图、缩略图

    背景 公司最近要求给我负责的APP加上视频录制和发布的功能,我简单的完成了基本的录制和视频压缩功能,后来发现发布接口需要上传视频的截图,网上搜索了一下资料,在这里整理一下. 代码实现 /** * 获取视频文件截图 * * @param path 视频文件的路径 * @return Bitmap 返回获取的Bitmap */ public static Bitmap getVideoThumb(String path) { MediaMetadataRetriever media = new Me

  • android 获取视频,图片缩略图的具体实现

    1.获取视频缩略图有两个方法(1)通过内容提供器来获取(2)人为创建缩略图 (1)缺点就是必须更新媒体库才能看到最新的视频的缩略图 [java] 复制代码 代码如下: /**      * @param context      * @param cr     * @param Videopath     * @return      */     public static Bitmap getVideoThumbnail(Context context, ContentResolver cr

  • Android raw 目录下视频的缩略图的获取

     Android raw 目录下视频的缩略图的获取 以下代码用于获取 Android raw目录下视频文件的缩略图: /** * 获取 raw 下 指定视频文件的缩略图 * @param aVideoName * @return */ private Drawable getThumbnail(String aVideoName) { Drawable ret = null; int id = 0; try { id = R.raw.class.getDeclaredField(aVideoNa

  • Android实现微信分享带有缩略图的网页

    前言 最近做了一个web app 需要做微信分享. 需求是分享web页还要带有图片,并且图片还不是本地的,这就有点坑了, 也就是说图片还要从网络实时获取并且是同步的,如果是异步的还需要等待(用户体验就不好了) 代码如下 /** * 微信分享 好友 */ public void wxHyShare(String shareUrl, String title, String image, String desc) { IWXAPI api = WXAPIFactory.createWXAPI(con

  • Android获取SD卡上图片和视频缩略图的小例子

    如何判断文件呢? 可以通过Cursor遍历数据库,对比INTERNAL_CONTENT_URI字段的值,这是一个Uri,这里保存着Android手机SD卡上的多媒体文件完整路径. [java] 复制代码 代码如下: Uri originalUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;                 //若为视频则为MediaStore.Video.Media.EXTERNAL_CONTENT_URI;          

  • Android编程获取图片和视频缩略图的方法

    本文实例讲述了Android编程获取图片和视频缩略图的方法.分享给大家供大家参考,具体如下: 从Android 2.2开始系统新增了一个缩略图ThumbnailUtils类,位于framework的android.media.ThumbnailUtils位 置,可以帮助我们从mediaprovider中获取系统中的视频或图片文件的缩略图,该类提供了三种静态方法可以直接调用获取. 1. createVideoThumbnail static Bitmap createVideoThumbnail(

  • Android实现点击缩略图放大效果

    本文实例为大家分享了Android点击缩略图放大效果的具体代码,供大家参考,具体内容如下 import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.graphics.Point; import and

  • Android 使用Vitamio打造自己的万能播放器(5)——在线播放(播放优酷视频)

     前言 为了保证每周一篇的进度,又由于Vitamio新版本没有发布, 决定推迟本地播放的一些功能(截图.视频时间.尺寸等),跳过直接写在线播放部分的章节.从Vitamio的介绍可以看得出,其支持http.m3u8等多种网络协议,本章将编写播放优酷视频的例子. 系列 1.Android使用Vitamio打造自己的万能播放器(1)--准备 2.Android使用Vitamio打造自己的Android万能播放器(2)-- 手势控制亮度.音量.缩放 3.Android使用Vitamio打造自己的Andr

  • Android 使用Vitamio打造自己的万能播放器(4)——本地播放(快捷搜索、数据存储)

    前言 关键字:Vitamio.VPlayer.Android播放器.Android影音.Android开源播放器 本章节把Android万能播放器本地播放的主要功能(缓存播放列表和A-Z快速查询功能)完成,和播放组件关系不大,但用到一些实用的技术,欢迎交流! 系列 1.Android 使用Vitamio打造自己的万能播放器(1)--准备 2.Android 使用Vitamio打造自己的万能播放器(2)-- 手势控制亮度.音量.缩放 3.Android 使用Vitamio打造自己的万能播放器(3)

  • Android 使用Vitamio打造自己的万能播放器(3)——本地播放(主界面、播放列表)

    前言 打造一款完整可用的Android播放器有许多功能和细节需要完成,也涉及到各种丰富的知识和内容,本章将结合Fragment.ViewPager来搭建播放器的主界面,并实现本地播放基本功能.系列文章提供截图.代码说明.源码下载,欢迎交流! 系列 1.Android 使用Vitamio打造自己的万能播放器(1)--准备 2.Android 使用Vitamio打造自己的万能播放器(2)-- 手势控制亮度.音量.缩放  正文 一.目标 1.1 使用Fragment.ViewPager搭建主界面 主功

  • Android 使用Vitamio打造自己的万能播放器(2)—— 手势控制亮度、音量、缩放

    前言 本章继续完善播放相关播放器的核心功能,为后续扩展打好基础. 系列 1.Android 使用Vitamio打造自己的万能播放器(1)--准备 正文 一.实现目标 1.1 亮度控制 模仿VPlayer界面: 1.2 声音控制 模仿VPlayer界面: 1.3 画面缩放 根据下面API提供画面的拉伸.剪切.100%.全屏     二.Vitamio API 介绍 VideoView 2.1 public void start() 开始播放 2.2 public void pause() 暂停播放

  • Android 使用Vitamio打造自己的万能播放器(6)——在线播放(播放列表)

    前言 新版本的VPlayer由设计转入开发阶段,预计开发周期为一个月,这也意味着新版本的Vitamio将随之发布,开发者们可以和本系列文章一样,先开发其他功能.本章内容为"在线视频播放列表",集合了主流各大视频网站的手机版,欢迎给"开播视频"反馈改进建议! 系列 1.Android 使用Vitamio打造自己的万能播放器(1)--准备 2.Android 使用Vitamio打造自己的Android万能播放器(2)-- 手势控制亮度.音量.缩放 3.Android 使

  • Android 使用Vitamio打造自己的万能播放器(7)——在线播放(下载视频)

    前言 本章将实现非常实用的功能--下载在线视频.涉及到多线程.线程更新UI等技术,还需思考产品的设计,如何将新加的功能更好的融入到现有的产品中,并不是简单的加一个界面就行了,欢迎大家交流产品设计和技术细节实现! 系列 1.Android 使用Vitamio打造自己的万能播放器(1)--准备 2.Android 使用Vitamio打造自己的万能播放器(2)-- 手势控制亮度.音量.缩放 3.Android 使用Vitamio打造自己的万能播放器(3)--本地播放(主界面.视频列表) 4.Andro

  • Android 使用Vitamio打造自己的万能播放器(9)—— 在线播放 (在线电视)

    前言 如果不想自己去找视频看,以传统方式看电视也不错,比如CCTV.湖南卫视等.本章从网络收集几百个电视台的地址,采用多级分类方式呈现,极大丰富在线播放部分的内容. 系列 1.Android 使用Vitamio打造自己的万能播放器(1)--准备 2.Android 使用Vitamio打造自己的万能播放器(2)-- 手势控制亮度.音量.缩放 3.Android 使用Vitamio打造自己的万能播放器(3)--本地播放(主界面.视频列表) 4.Android 使用Vitamio打造自己的万能播放器(

  • Android 使用Vitamio打造自己的万能播放器(8)——细节优化

    前言 成功的产品往往在细节之处也做到极致,产品和项目从使用的角度来看最大的区别我认为也就是细节的处理上.开播视频的目标是产品,前面7篇文章高歌猛进,添加了很多的功能,也该停下来休整一下,优化一下,也欢迎交流反馈做得不周到的地方.由于开源,大家也可以按照自己的喜好来添加修改不同的功能和细节. 系列 1.Android 使用Vitamio打造自己的万能播放器(1)--准备 2.Android 使用Vitamio打造自己的万能播放器(2)-- 手势控制亮度.音量.缩放 3.Android 使用Vita

  • Android 使用Vitamio打造自己的万能播放器(10)—— 本地播放 (缩略图、视频信息、视频扫描服务)

    前言 Vitamio是我们团队的诚意之作,除了要将VPlayer打造成Android最好的播放器,也要将Vitamio打造成Android最好的播放器组件.新版发布内测SDK虽然还有一些问题,但已经具备高可扩展性.便捷性和许多内置实用的功能,后续文章将继续深挖和介绍Vitamio的使用细节和方法.本章将提供显示缩略图.视频大小等视频信息,并介绍使用Vitamio内置的ContentProvider以及文件扫描服务. 注意 本章ContentProvider在2012-8-31发布的SDK中已经不

  • Android 使用Vitamio打造自己的万能播放器(1)——准备

    前言 虽然Android已经内置了VideoView组件和MediaPlayer类来支持开发视频播放器,但支持格式.性能等各方面都十分有限,这里与大家一起利用免费的Vitamio来打造属于自己的Android万能播放器! 正文 一.实现目标 1.1 支持格式 支持主流的视音频格式:mp3/mp4/mkv/avi/3gp/rmvb/mov/flv等. 1.2 支持功能 1.2.1 当然最重要的是播放功能,含播放控制(播放.暂停,声音.亮度调整等) 1.2.2 可以扫描SDcard,用列表展现出来,

随机推荐