Android系统的方式提取视频帧(硬)
注:提取关键帧要比非关键帧快很多倍
getFrameAtTime参数
方法原型:public Bitmap getFrameAtTime(long timeUs, int option)
第一个参数
是传入截取时间,只能是us(微秒)
第二个参数
OPTION_CLOSEST
在给定的时间,检索最近一个帧,这个帧不一定是关键帧。
OPTION_CLOSEST_SYNC
在给定的时间,检索最近一个同步与数据源相关联的的帧(关键帧)。
OPTION_NEXT_SYNC
在给定时间之后检索一个同步与数据源相关联的关键帧。
OPTION_PREVIOUS_SYNC
在给定时间之前检索一个同步与数据源相关的关键帧
这里为了提取我们想要的帧,不使用关键帧,所以用 OPTION_CLOSEST
public Bitmap getFrameAtTime()
//如果不加参数的话,提取第一个关键帧
public Bitmap getFrameAtTime() {
return getFrameAtTime(-1, OPTION_CLOSEST_SYNC);
}
/**
* 获取视频文件截图
*
* @param path 视频文件的路径
* @return Bitmap 返回获取的Bitmap
*/
public Bitmap getVideoThumb(String path) {
MediaMetadataRetriever media = new MediaMetadataRetriever();
media.setDataSource(path);
Bitmap frameAtTime = media.getFrameAtTime(1 * 1000 * 1000, MediaMetadataRetriever.OPTION_CLOSEST);
if (frameAtTime == null) {
frameAtTime = media.getFrameAtTime(3 * 1000 * 1000, MediaMetadataRetriever.OPTION_CLOSEST);
}
return frameAtTime;
}
Android系统方法获取视频封面(硬,第一帧)
/**
* 获取视频文件截图
*
* @param path 视频文件的路径
* @return Bitmap 返回获取的Bitmap
* MINI_KIND FULL_SCREEN_KIND MICRO_KIND
*/
public Bitmap getVideoCover(String path) {
Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(path, MediaStore.Images.Thumbnails.MINI_KIND);
if (bitmap == null) {
//提取到的视频封面为空
showToast("没有提取到的视频封面,请换个视频尝试");
finish();
}
return bitmap;
}