Android 手把手做视频文件第一帧缓存

前言:

         在我刚刚完成的一个版本开发中,有这样的一个需求,我们选择了多个视频,进入到下面几个层级的时候,需要把视频文件的第一帧图片展示在imageview上,对视频做处理,在这个地方,怎样把视频第一帧图像很快的取出来,就有了这篇文章,以记录开发中的点点滴滴,下面开始介绍。  

         1.场景设置为读取手机的视频文件,gridview显示视频第一帧,显示的速率不能太慢了,选择多个视频,进入到第二层界面,界面要非常快显示出视频的封面。

        2.now let's do it,首先第一步在项目的AndroidManifest清单文件中添加上读取权限


AndroidManifest添加读写权限

      3.第二步先获出来的所有的视频文件,所以先定义视频文件bean对象MediaModeVideo,一个视频文件的name,文件fileUrl,视频文件时长,现在定义单个的文件夹对象VideoPhotoFloder,这个对象我包含了视频和图片的集合对象,但是这里我们只需要视频集合。


MediaModeVideo视频对象


VideoPhotoFloder视频图片文件夹对象

       3.第三步获取手机里面的视频文件,有了对象了,那还会单身吗,哈哈😄,写一个util工具类获取全部的视频文件分文件夹都取出来,别忘了在界面打开的时候申请权限,不然就尴尬了,说什么都不如代码实在。




获取视频util

    获取视频的方法是调用Android 内容解析器ContentResolver,查询的5个参数uri,projection,selection,selectionArgs,sortOrder,具体5个参数的用处就自行学习吧。现在方法已经有了,可以拿到数据了,界面上的绘画就比较简单了,一个简单的gridview,调用我们的util的获取方法设置适配器就完事

界面调用获取video集合方法

      为了让其他界面能快速的拿到视频对象的第一帧,在这个适配器的里面就是我们要重点说的地方。在adapter里面对视频文件根据地址异步获取第一帧做缓存,就是为了在后面的操作中可以快速的获取到视频的封面。


adapter中异步加载视频第一帧调用

还是不说废话上代码,继承AsyncTask,定义一次执行线程数量最多10个个线程,


异步读取视频第一帧缓存

       因为我们定义了视频和图片两种类型或者加了type类型作为BLGalleryCache读取的条件之一


异步操作

  我在异步处理中分配给自己做的缓存BLGalleryCache大小是进程内存的1/8,BLGalleryRetainCache一个单例类保证BLGalleryCache单例,好了现在就介绍BLGalleryCache的作用,

bitmap的缓存类

        缓存主要用的是LruCache,LruCache是android提供的一个缓存工具类,其算法是最近最少使用算法。它把最近使用的对象用“强引用”存储在LinkedHashMap中,并且把最近最少使用的对象在缓存值达到预设定值之前就从内存中移除,就是酱紫😯,在adapter中单个new 出来的时候,从单例中获取到mBitmapCache根据key取对应的bitmap.在LruCache清理掉的时候,开个AsyncTask再去取。


获取bitmap

可以看到我设置了一个条件当不是在滑动的时候才去加载,在Scrolling的时候是没有执行task的,这样也只是为了不损耗资源吧。好了,最后一步了,在mBitmapCache里面没有或者被清理的时候,去AsyncTask地址Url获取bitmap

private classBLBitmapLoaderTaskextendsAsyncTask {

privateBaseAdaptermAdapter;

privateStringmImageKey;

publicBLBitmapLoaderTask(String imageKey,BaseAdapter adapter) {

mAdapter= adapter;

mImageKey= imageKey;

}

@Override

protected voidonPreExecute() {

mCurrentTasks.add(mImageKey);

}

@Override

protectedBitmapdoInBackground(Void... params) {

Bitmap bitmap =null;

try{

bitmap = ThumbnailUtils.createVideoThumbnail(mImageKey,

Thumbnails.FULL_SCREEN_KIND);

if(bitmap !=null) {

bitmap = Bitmap.createScaledBitmap(bitmap,mMaxWidth,

mMaxWidth, false);

addBitmapToCache(mImageKey,bitmap);

returnbitmap;

}

return null;

}catch(Exception e) {

if(e !=null) {

e.printStackTrace();

}

return null;

}

}

@Override

protected voidonPostExecute(Bitmap param) {

mCurrentTasks.remove(mImageKey);

if(param !=null) {

if(mAdapter!=null)

mAdapter.notifyDataSetChanged();

}

}

}

直接上代码了,传递adapter过来是为了让界面刷新,imageview是adapter里面调用的时候传递的holder .image.到此为止,我们的缓存就搞出来了,核心就是利用LruCache其特性做这件事。好处就是什么呢,好处就是在我很深层级的地方,只要一个视频的地址就可以轻松拿到bitmap。渲染速率,自然非常快,也完美的完成了项目的需求。需要调用的地方就是简单的一行代码搞定


最后显示调用方法


代码链接后面会附上。现在看下场景运行的效果


真机效果图

    因为限制10M,所以压缩的挺厉害的,有些失真了,感谢大家的阅读,希望对大家有一点点的促进,代码会托管到git上,链接随后附上。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,832评论 25 707
  • 一、缓存介绍: (一)、Android中缓存的必要性: 智能手机的缓存管理应用非常的普遍和需要,是提高用户体验的有...
    温暖的外星阅读 880评论 0 12
  • 【1009今日剽悍】 有时候父母的话并不中听,但是他们的最终出发点都是为了让你变得更好。 所以,不管父母的言辞如何...
    好听的暖阳阅读 207评论 0 0
  • 昨天和康康共读《我的事情 我来做》《panda bear》《 晚安 小鸡球球》 晚上看绘本进行的挺好的,会跟着看与...
    马靖恩阅读 225评论 2 1
  • 更易被时光带走 此刻,谁站在叶子顶端 谁就能摸到梦的指尖 人所不及的高度 露珠闪烁,仿佛神谕
    pj蓝路阅读 123评论 0 1