android 获取视频第一帧作为缩略图的方法
作者:暴走邻家 发布时间:2022-11-22 19:30:25
今天,简单讲讲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();
}
android 获取视频第一帧作为缩略图就讲完了。
就这么简单。以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
来源:https://blog.csdn.net/bzlj2912009596/article/details/80446256
猜你喜欢
- 本文实例总结了Java编程实现生成给定范围内不重复随机数的方法。分享给大家供大家参考,具体如下:在Java中的Math类中存在一个rando
- @Resource和@Autowired是Spring Framework中两种常用的注入方式,它们的作用是在Spring容器中自动装配Be
- 一、堆排序1、什么是堆排序(1)堆排序:堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构
- 本文介绍了Java设计模式之享元模式,供大家参考,具体内容如下1、关于享元模式享元模式有点类似于单例模式,都是只生成一个对象被共享使用。享元
- org.junit.jupiter.api不存在解决方案spring boot2.2之后和之前的测试类编写方法不一致修改为:// A cod
- //直接插入排序void DirectInsertionSort(int* arr, in
- 前言很多时候,我们定义接口或者调用别人的接口时,手里只有一份接口文档,文档中提供一段示例json格式的报文,我们需要根据json中的字段,挨
- WebView 网页滚动截屏,可对整个网页进行截屏而不是仅当前屏幕哦! 注意若Web页面存在position:fixed; 的话得在调用前设
- 二维数组实现数字拼图,供大家参考,具体内容如下二维数组可以自己随意定义大小,通过方法判断来实现对所有的数字进行随机打乱,并可以通过移动来正确
- 最近有个需求,我需要获取所有同一类型的定时任务的对象,并自动执行。我想的方案是:直接获取某个接口下面所有的实现类的对象集合,方便以后只需要
- 现在Web开发越来越倾向于前后端分离,前端使用AngularJS,React,Vue等,部署在NodeJS上,后面采用SpringBoot发
- 场景很多情况下,查单条记录也用通用查询接口,但是输入的条件却能确定唯一性。如果我们要确定list中只有一条记录,如下写法:// 记录不为空
- 一、创建资源文件可以将字符串、图像或对象数据等资源包含在资源文件中,方便应用程序使用。创建资源文件的方法:1、手动或使用IDE工具自动生成X
- 前言:$是c# 6.0 的语言特性,功能类似string.format(),更方便的地方在于不要像format一样使用索引,可以直接使用变量
- 前言 在软件开发中,我们通常会遇到一种场景,比如某个请求,会依次经过系统中的很多个模块来处理,如果某个模
- 将SuperSocket封装成类库之后可以将其集成进各种类型的应用,而不仅仅局限于控制台应用程序了,从而应用于不同的场景。这里以Telnet
- 1.准备工作1、新建一个SpringBoot项目加上web依赖, 所有依赖<dependency><groupId>
- String类型小数值转为Long类型数值分为小数和整数,当传入的类型为String,需要获取的类型为Long,这时候直接通过Long.va
- 本文实例为大家分享了Spring Boot图片上传的具体代码,供大家参考,具体内容如下package com.clou.inteface.d
- 本文实例为大家分享了Unity3D实现攻击范围检测的具体代码,供大家参考,具体内容如下一、扇形攻击范围检测using UnityEngine