android 获取视频第一帧作为缩略图的方法

 更新时间:2019年08月16日 16:23:22   作者:暴走邻家  
这篇文章主要介绍了android 获取视频第一帧作为缩略图的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

今天,简单讲讲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实现圆形纯数字按钮

    Android实现圆形纯数字按钮

    这篇文章主要为大家详细介绍了Android实现圆形纯数字按钮,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • 屏蔽RecyclerView单边滑动到头阴影(fadingEdge)的方法

    屏蔽RecyclerView单边滑动到头阴影(fadingEdge)的方法

    这篇文章主要给大家介绍了如何屏蔽RecyclerView单边滑动到头阴影(fadingEdge)的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-04-04
  • Android实现网页图片浏览功能

    Android实现网页图片浏览功能

    这篇文章主要为大家详细介绍了Android实现网页图片浏览功能,输入图片的url然后点击按钮加载出来图片,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • Android实现QQ登录界面遇到问题及解决方法

    Android实现QQ登录界面遇到问题及解决方法

    本文给大家介绍android仿qq登录界面的实现代码,在实现此功能过程中遇到各种问题,但是最终都顺利解决,如果大家对android qq登录界面实现方法感兴趣的朋友一起学习吧
    2016-09-09
  • Flutter路由框架Fluro使用简介

    Flutter路由框架Fluro使用简介

    这篇文章主要介绍了Flutter路由框架Fluro使用简介,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • Android 实现自定义圆形进度条的功能

    Android 实现自定义圆形进度条的功能

    这篇文章主要介绍了Android 实现自定义圆形进度条的功能的相关资料,开发Android应用的朋友肯定对自定义View不陌生,很多都有重新写的,这里就对实现圆形进度条介绍下,需要的朋友可以参考下
    2016-11-11
  • Android TabLayout选项卡使用教程

    Android TabLayout选项卡使用教程

    这篇文章主要介绍了Android TabLayout选项卡使用,为什么会有这篇文章呢,是因为之前关于TabLayout的使用陆陆续续也写了好几篇了,感觉比较分散,且不成体系,写这篇文章的目的就是希望能把各种效果的实现一次性讲齐
    2023-04-04
  • 实例讲解Android中SQLiteDatabase使用方法

    实例讲解Android中SQLiteDatabase使用方法

    这篇文章主要以一个简单的实例为大家详细讲解Android中SQLiteDatabase使用方法,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • Android Studio的中文乱码问题解决方法

    Android Studio的中文乱码问题解决方法

    Android Studio安装后发现所有的中文,不管是界面上的还是输出的log中的中文都变成小框框,具体的解决方法如下,感兴趣的朋友可以参考下哈
    2013-06-06
  • Android 清除SharedPreferences 产生的数据(实例代码)

    Android 清除SharedPreferences 产生的数据(实例代码)

    项目是要保存上次文件播放的位置,我使用SharedPreferences来保存,键值对分别是文件路径和当时播放的位置
    2013-11-11

最新评论