欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2022-04-29 10:34:08
今天,简单讲讲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 获取视频第一帧作为缩略图就讲完了。

就这么简单。以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。