linux获取视频第一帧,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  在给定时间之后检索一个同步与数据源相关联的关键帧。

二.使用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 获取视频第一帧作为缩略图就讲完了。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值