android 获取视频第一帧作为缩略图的方法
今天,简单讲讲android里如何获取一个视频文件的第一帧作为缩略图显示在界面上。
之前,我说个最近需要从服务器下载视频文件,但是下载后肯定需要显示视频的缩略图在界面上给用户看,于是想到显示视频的第一帧作为缩略图。但是我不知道具体怎么写,于是在网上查找资料,最终是解决了问题。这里记录一下。
一.使用MediaMetadataRetriever获取视频的第一帧作为缩略图
/** *获取视频文件截图 * *@parampath视频文件的路径 *@returnBitmap返回获取的Bitmap */ publicstaticBitmapgetVideoThumb(Stringpath){ MediaMetadataRetrievermedia=newMediaMetadataRetriever(); media.setDataSource(path); returnmedia.getFrameAtTime(); }
这里需要注意一点,从API10开始新增一类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秒后最近位置的关键帧,其实就是第一帧数据。下面简单说一下publicBitmapgetFrameAtTime(longtimeUs,intoption):
publicBitmapgetFrameAtTime(longtimeUs,intoption)第一个参数是传入时间,只能是us(微秒),当时我传入的ms,获取的总是第一帧,所以这个问题都弄了好久。
然后是第二个参数,先看看官方解释:
OPTION_CLOSEST 在给定的时间,检索最近一个帧,这个帧不一定是关键帧。
OPTION_CLOSEST_SYNC 在给定的时间,检索最近一个同步与数据源相关联的的帧(关键帧)。
OPTION_NEXT_SYNC 在给定时间之后检索一个同步与数据源相关联的关键帧。
OPTION_PREVIOUS_SYNC 顾名思义,同上
二.使用ThumbnailUtils获取视频的第一帧作为缩略图
/** *获取视频的缩略图 *先通过ThumbnailUtils来创建一个视频的缩略图,然后再利用ThumbnailUtils来生成指定大小的缩略图。 *如果想要的缩略图的宽和高都小于MICRO_KIND,则类型要使用MICRO_KIND作为kind的值,这样会节省内存。 *@paramvideoPath视频的路径 *@paramwidth指定输出视频缩略图的宽度 *@paramheight指定输出视频缩略图的高度度 *@paramkind参照MediaStore.Images(Video).Thumbnails类中的常量MINI_KIND和MICRO_KIND。 *其中,MINI_KIND:512x384,MICRO_KIND:96x96 *@return指定大小的视频缩略图 */ publicstaticBitmapgetVideoThumbnail(StringvideoPath,intwidth,intheight,intkind){ Bitmapbitmap=null; //获取视频的缩略图 bitmap=ThumbnailUtils.createVideoThumbnail(videoPath,kind);//調用ThumbnailUtils類的靜態方法createVideoThumbnail獲取視頻的截圖; if(bitmap!=null){ bitmap=ThumbnailUtils.extractThumbnail(bitmap,width,height, ThumbnailUtils.OPTIONS_RECYCLE_INPUT);//調用ThumbnailUtils類的靜態方法extractThumbnail將原圖片(即上方截取的圖片)轉化為指定大小; } returnbitmap; }
简单讲讲,这个其实很简单,就是调用ThumbnailUtils.createVideoThumbnail(path,kind)获取第一帧数据,然后通过bitmap=ThumbnailUtils.extractThumbnail(bitmap,width,height, ThumbnailUtils.OPTIONS_RECYCLE_INPUT);将图片转成指定大小。
下面还列举如何将bitmap保存到文件,因为获取到视频的缩略图后,可能需要保存到本地,下次进入app时可以直接查看。
/** *Bitmap保存成File * *@parambitmapinputbitmap *@paramnameoutputfile'sname *@returnStringoutputfile'spath */ publicstaticStringbitmap2File(Bitmapbitmap,Stringname){ Filef=newFile(Environment.getExternalStorageDirectory()+name+".jpg"); if(f.exists())f.delete(); FileOutputStreamfOut=null; try{ fOut=newFileOutputStream(f); bitmap.compress(Bitmap.CompressFormat.JPEG,100,fOut); fOut.flush(); fOut.close(); }catch(IOExceptione){ returnnull; } returnf.getAbsolutePath(); }
android获取视频第一帧作为缩略图就讲完了。
就这么简单。以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。