今天,简单讲讲android里如何获取一个视频文件的第一帧作为缩略图显示在界面上。

之前,我说个最近需要从服务器下载视频文件,但是下载后肯定需要显示视频的缩略图在界面上给用户看,于是想到显示视频的第一帧作为缩略图。但是我不知道具体怎么写,于是在网上查找资料,最终是解决了问题。这里记录一下。

一.使用MediaMetadataRetriever获取视频的第一帧作为缩略图

/**  * 获取视频文件截图  * * @param path 视频文件的路径 * @return Bitmap 返回获取的Bitmap */public  static Bitmap getVideoThumb(String path) {  MediaMetadataRetriever media = new MediaMetadataRetriever(); media.setDataSource(path); return  media.getFrameAtTime(); } 

这里需要注意一点,从API 10开始新增一类MediaMetadataRetriever可以用来获取媒体文件的信息,可以获取视频任何一帧的缩略图。所以使用MediaMetadataRetriever的API最小为10.

这里还列举一下MediaMetadataRetriever获取视频的其他几个函数:

//获取第一帧原尺寸图片
mmrc.getFrameAtTime();//获取指定位置的原尺寸图片 注意这里传的timeUs是微秒
mmrc.getFrameAtTime(timeUs, option);//获取指定位置指定宽高的缩略图
mmrc.getScaledFrameAtTime(timeUs, MediaMetadataRetrieverCompat.OPTION_CLOSEST, width, height);//获取指定位置指定宽高并且旋转的缩略图
mmrc.getScaledFrameAtTime(timeUs, MediaMetadataRetrieverCompat.OPTION_CLOSEST, width, height, rotate);

这里简单讲讲,media.getFrameAtTime()实际上也是调用mmrc.getFrameAtTime(-1, OPTION_CLOSEST_SYNC );即获取从-1秒后最近位置的关键帧,其实就是第一帧数据。下面简单说一下public Bitmap getFrameAtTime(long timeUs, int option):

public Bitmap getFrameAtTime(long timeUs, int option) 第一个参数是传入时间,只能是us(微秒) ,当时我传入的ms,获取的总是第一帧,所以这个问题都弄了好久。

然后是第二个参数,先看看官方解释:

OPTION_CLOSEST    在给定的时间,检索最近一个帧,这个帧不一定是关键帧。

OPTION_CLOSEST_SYNC    在给定的时间,检索最近一个同步与数据源相关联的的帧(关键帧)。

OPTION_NEXT_SYNC  在给定时间之后检索一个同步与数据源相关联的关键帧。

OPTION_PREVIOUS_SYNC   顾名思义,同上

二.使用ThumbnailUtils获取视频的第一帧作为缩略图

/*** 获取视频的缩略图* 先通过ThumbnailUtils来创建一个视频的缩略图,然后再利用ThumbnailUtils来生成指定大小的缩略图。* 如果想要的缩略图的宽和高都小于MICRO_KIND,则类型要使用MICRO_KIND作为kind的值,这样会节省内存。* @param videoPath 视频的路径* @param width 指定输出视频缩略图的宽度* @param height 指定输出视频缩略图的高度度* @param kind 参照MediaStore.Images(Video).Thumbnails类中的常量MINI_KIND和MICRO_KIND。*            其中,MINI_KIND: 512 x 384,MICRO_KIND: 96 x 96* @return 指定大小的视频缩略图*/public static Bitmap getVideoThumbnail(String videoPath, int width, int height,int kind) {Bitmap bitmap = null;// 获取视频的缩略图bitmap = ThumbnailUtils.createVideoThumbnail(videoPath, kind); //調用ThumbnailUtils類的靜態方法createVideoThumbnail獲取視頻的截圖;if(bitmap!= null){bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,ThumbnailUtils.OPTIONS_RECYCLE_INPUT);//調用ThumbnailUtils類的靜態方法extractThumbnail將原圖片(即上方截取的圖片)轉化為指定大小;}return bitmap;}

简单讲讲,这个其实很简单,就是调用ThumbnailUtils.createVideoThumbnail(path, kind)获取第一帧数据,然后通过bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height, ThumbnailUtils.OPTIONS_RECYCLE_INPUT);将图片转成指定大小。

下面还列举如何将bitmap保存到文件,因为获取到视频的缩略图后,可能需要保存到本地,下次进入app时可以直接查看。

/**  * Bitmap保存成File * * @param bitmap input bitmap * @param name output file's name * @return String output file's path */public  static String bitmap2File(Bitmap bitmap, String name) { File f = new File(Environment.getExternalStorageDirectory() + name +  ".jpg"); if  (f.exists()) f.delete(); FileOutputStream fOut = null; try  { fOut = new FileOutputStream(f); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fOut);  fOut.flush();  fOut.close();  } catch (IOException e) { return  null; } return  f.getAbsolutePath(); }

android 获取视频第一帧作为缩略图就讲完了。

就这么简单。



android 获取视频第一帧作为缩略图相关推荐

  1. Android之使用ThumbnailUtils类来获取视频第一帧缩略图

    一.首先,来介绍ThumbnailUtils类,此类位于android.media包下,此类有一个公有的无参构造函数,有三个静态的公有方法,一个用来获取视频第一帧得到的Bitmap,另外两个方法用 ...

  2. Android之使用MediaMetadataRetriever类获取视频第一帧

    一.首先,来介绍一下MediaMetadataRetriever类,此类位于android.media包下,这里,先附上可查看此类的API地址:MediaMetadataRetriever类,大家可以 ...

  3. 小程序获取视频第一帧

    小程序获取视频第一帧 最近有个小程序项目,需要在页面中展示大量的视频,但是不用播放.后来遇到问题,小程序不可以在一个页面中放置超过5个video标签,否则播放视频加载不到. 经过度娘查询找到一篇大佬的 ...

  4. windows下PHP获取视频第一帧图片作为背景图

    我在网上找了很多这方面的资料,总结如下:一般用ffmpeg获取视频第一帧图片作为背景图; ffmpeg的下载链接  http://ffmpeg.org/download.html ; 下载好包,包里面 ...

  5. vue 上传视频到腾讯云存储并获取视频第一帧

    官网文档链接:https://cloud.tencent.com/document/product/436/6268 需求 项目里之前上传视频是调后端接口,接口将视频保存到服务器,然后返回视频链接. ...

  6. 在文件管理器中显示图片的缩略图和视频第一帧的缩略图

    首先在vender/mediatek/properties/packags/apps/FileManager/src/com/mediatek/filemanager/IconManager.java ...

  7. 前端开发如何获取视频第一帧作为封面

    首先说明一下,浏览器或者手机需要支持video标签. 从H5本身来说,这里用到了video的一个属性,poster(规定视频下载时显示的图像,或者在用户点击播放按钮前显示的图像.). 然后还有一个vi ...

  8. uni-app 获取视频第一帧转换为图片 并展示

    话不多说,直接上代码 <template><view class="content"><image v-if="demo != ''&quo ...

  9. java获取视频第一帧工具类

    java获取视频文件第一帧,为了防止黑画面,此例取第五帧,本例子采用maven形式,可以获取视频的文件大小. 1. pom.xml 添加引用jar包 jdk采用1.8,日志自行添加即可,这里使用的是l ...

最新文章

  1. python06-集合和序列
  2. mysql选什么隔离级别_互联网项目中mysql应该选什么事务隔离级别
  3. 在数据中心利用AI的5个理由
  4. jQuery实现获取选中复选框的值
  5. 学生管理系统(C语言)
  6. PostgreSQL Huge Page 使用建议 - 大内存主机、实例注意
  7. [评论]为什么程序员的社会地位不高?--转载
  8. 什么端口可以抓LINUX,linux下开启某个端口的方法:可用于SQL
  9. java 数据库 properties_原生Java读取properties连接数据库
  10. OpenOffice+JodConverter实现Office文件到PDF的转换
  11. VARCHART XGantt甘特图具有更多功能的HTML5 / Gantt图表的可视计划小部件
  12. 怎样将自己学到的东西发布到博客
  13. java基本数据类型转类对象
  14. 【系统分析师之路】第二十一章 复盘系分专业英语
  15. vue之ele组件中的select下拉 绑定对象值
  16. 题目 2291: [蓝桥杯][2018年第九届真题]调手表(BFS)
  17. Linux-----Ubuntu通过shell脚本将SSH多次登录失败的IP自动加入黑名单
  18. 什么会导致HTTP出现429请求过多错误?
  19. 微信小程序漏洞:可下载任意微信小游戏源代码
  20. xiangmu--WAD

热门文章

  1. JavaScript中的坐标
  2. 在基于nuxt的移动端页面中引用mint UI的popup组件之父子组件传值
  3. 使用Eclipsephp工具打开Thinkphp为什么会有红色的波浪线报警?
  4. project template
  5. 搜索引擎学习(四)中文分词器
  6. 粗略。。类设计的基本经验3之笔记
  7. java的内存管理机制
  8. 20131127-正则表达式
  9. Eclipse(STS) 初次搭建Spring Cloud项目之声明式REST调用+负载均衡实现Feign(四)
  10. druid读取hdfs文件