我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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点,为的是解决使用者心中的疑虑,最终更好的服务于用户。在文档不够全的情况下通过这种方式来与大家分享使用方法和技巧以及注意点,还请大家谅解。

您可能感兴趣的文章:Android 使用Vitamio打造自己的万能播放器(9)—— 在线播放 (在线电视)Android 使用Vitamio打造自己的万能播放器(8)——细节优化Android 使用Vitamio打造自己的万能播放器(7)——在线播放(下载视频)Android 使用Vitamio打造自己的万能播放器(6)——在线播放(播放列表)Android 使用Vitamio打造自己的万能播放器(5)——在线播放(播放优酷视频)Android 使用Vitamio打造自己的万能播放器(4)——本地播放(快捷搜索、数据存储)Android 使用Vitamio打造自己的万能播放器(3)——本地播放(主界面、播放列表)Android 使用Vitamio打造自己的万能播放器(2)—— 手势控制亮度、音量、缩放Android 使用Vitamio打造自己的万能播放器(1)——准备Android使用vitamio插件实现视频播放器


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

前言 Vitamio是我们团队的诚意之作,除了要将VPlayer打造成Android最好的播放器,也要将Vitamio打造成Android最好的播放器组件。新版发布内测SDK虽然还有一些问题,但已经具备高可扩展性、便捷性和许多内置实用的功
2022-06-06

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

前言为了保证每周一篇的进度,又由于Vitamio新版本没有发布, 决定推迟本地播放的一些功能(截图、视频时间、尺寸等),跳过直接写在线播放部分的章节。从Vitamio的介绍可以看得出,其支持http、m3u8等多种网络协议,本章将编写播放
2022-06-06

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

前言本章将实现非常实用的功能——下载在线视频。涉及到多线程、线程更新UI等技术,还需思考产品的设计,如何将新加的功能更好的融入到现有的产品中,并不是简单的加一个界面就行了,欢迎大家交流产品设计和技术细节实现!系列1、Android 使用Vi
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录