MediaMetadataRetriever根据指定时间截取帧
2017.10.26
[摘要:使用MediaMetadataRetriever获取指定时间点的帧,并保存到图库中。当我需要实现这个功能时,第一时间是从百度查,但是查的有好多坑,有些不明白。希望这篇文章对大家方便使用,对自己以后方便再次使用。]
按照惯例先上代码
mediaMetadataRetriever = new MediaMetadataRetriever();
try {
//根据url获取缩略图
mediaMetadataRetriever.setDataSource(VideoUrl, new HashMap());
// 取得视频的长度(单位为毫秒)
String time = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
// 获取指定时间点的图片
Bitmap bitmap = mediaMetadataRetriever.getFrameAtTime(timeMs*1000,MediaMetadataRetriever.OPTION_CLOSEST);
// 保存到图库中
MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, "title", "description");
} catch (Exception e) {
e.printStackTrace();
} finally {
// 日常释放资源
mediaMetadataRetriever.release();
}
获取指定时间帧的关键代码为:
Bitmap bitmap = mediaMetadataRetriever.getFrameAtTime(timeMs * 1000, MediaMetadataRetriever.OPTION_CLOSEST);
public Bitmap getFrameAtTime(long timeUs, int option)
第一个参数:指点时间,只能是us(微秒)
第二个参数:
- OPTION_CLOSEST 在给定的时间,检索最近一个帧,这个帧不一定是关键帧。
- OPTION_CLOSEST_SYNC 在给定的时间,检索最近一个同步与数据源相关联的的帧(关键帧)。
- OPTION_NEXT_SYNC 在给定时间之后检索一个同步与数据源相关联的关键帧。
- OPTION_PREVIOUS_SYNC 顾名思义,同上
这里为了提取我们想要的帧,不使用关键帧,所以用 OPTION_CLOSEST .
MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, "title", "description");
解释下第一个参数:当前应用的 ContentResolver实例;剩下几个参数看名字理解