今天,简单讲讲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();  }

 

参考于:

https://blog.csdn.net/bzlj2912009596/article/details/80446256

更多相关文章

  1. Android Video Player. 安卓视频播放器,封装 MediaPlayer、ExoPla
  2. android 5.0视频教程
  3. 【Android】 从头搭建视频播放器(4)——屏幕旋转处理
  4. Android 系统资源(字体,声音,视频)的简介
  5. 二、VR全景图显示器开发 ---- Android VR视频/Google VR for And
  6. Android自定义对话框的大小
  7. MediaRecorder音视频框架
  8. 搭建WebRTC Android视频demo
  9. 原生Android缩略图填满SD卡的问题

随机推荐

  1. Android实现自动点击 - 无障碍服务
  2. android源代码下载——android环境配置
  3. 【Android】_SmsReceicer_短信监听
  4. 渐变色与圆角显示(填充,描边)
  5. Android入门之SeekBar
  6. Android(安卓)——Window类
  7. Android全屏显示的两种方式
  8. Hardware Acceleration | Android(安卓)D
  9. 指定浏览器访问指定页面(支持UC、Opera、
  10. Viewpager Indicator中PagerSlidngTab用