前言
在Android里获取视频的信息主要依靠MediaMetadataRetriever实现
获取视频预览图
/**
* 获取视频缩略图
* @param vedioFile
* @return
*/
fun getVideoThumbnail(vedioFile: File): Bitmap? {
if (!vedioFile.exists()) {
Log.e("zh", "视频文件不存在")
return null
}
val retriever = MediaMetadataRetriever()
retriever.setDataSource(vedioFile.getAbsolutePath())
return retriever.frameAtTime
}
/**
* 获取指定时间位置的视频缩略图
* @param vedioFile
* @return
*/
fun getVideoThumbnail(videoFile: File, time:Long): Bitmap? {
if (!videoFile.exists()) {
Log.e("zh", "视频文件不存在")
return null
}
val retriever = MediaMetadataRetriever()
retriever.setDataSource(videoFile.absolutePath)
return retriever.getFrameAtTime(time) //这里可以设置指定时间位置的缩略图
}
/**
* 从raw资源文件中获取视频缩略图
* @param vedioFile
* @return
*/
fun getVideoThumbnail(context: Context, resId:Int): Bitmap? {
val uri = Uri.parse("android.resource://" + context.packageName +"/"+ resId)
val retriever = MediaMetadataRetriever()
retriever.setDataSource(context, uri)
return retriever.getFrameAtTime()
}
通过ThumbnailUtils缩略图工具类获取缩略图
val path = holder.binding.root.context.getExternalFilesDir(null).getPath() + File.separator + "big_buck_bunny.mp4"
val bitmap = ThumbnailUtils.createVideoThumbnail(path, MediaStore.Images.Thumbnails.MINI_KIND)
获取视频播放时长
/** * 返回视频播放总时长 * @param vedioFile * @return */ public static Long getVedioTotalTime(File vedioFile){ if (!vedioFile.exists()){ L.e("视频文件不存在"); return null; } MediaMetadataRetriever retriever = new MediaMetadataRetriever(); retriever.setDataSource(vedioFile.getAbsolutePath()); String timeString = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); Long time = Long.valueOf(timeString); return time; }
获取其他信息参考表
/ ** *元数据键,用于检索描述的数字字符串 *原始录音中音频数据源的顺序。 * / public static final int METADATA_KEY_CD_TRACK_NUMBER = 0; / ** 元数据键,用于检索有关专辑标题的信息数据源。 * / public static final int METADATA_KEY_ALBUM = 1; / ** 元数据键,用于检索有关艺术家的信息数据源。 * / public static final int METADATA_KEY_ARTIST = 2; / ** 元数据键,用于检索有关作者的信息数据源。 * / public static final int METADATA_KEY_AUTHOR = 3; / ** 元数据键,用于检索有关作曲家的信息数据源。 * / public static final int METADATA_KEY_COMPOSER = 4; / ** 用于检索创建数据源的日期的元数据键或修改。 * / public static final int METADATA_KEY_DATE = 5; / ** 元数据键,用于检索数据的内容类型或类型资源。 * / public static final int METADATA_KEY_GENRE = 6; / ** 用于检索数据源标题的元数据键。 * / public static final int METADATA_KEY_TITLE = 7; / ** 元数据键,用于检索创建数据源的年份或修改。 * / public static final int METADATA_KEY_YEAR = 8; / ** 元数据键,用于检索数据源的播放持续时间。 * / public static final int METADATA_KEY_DURATION = 9; / ** 用于检索音轨数量的元数据键,例如音频,视频,文本,在数据源中,如mp4或3gpp文件。 * / public static final int METADATA_KEY_NUM_TRACKS = 10; / ** 用于检索作者信息的元数据键(例如词作者)的数据源。 * / public static final int METADATA_KEY_WRITER = 11; / ** *于检索数据源的mime类型的元数据键。一些 示例mime类型包括:“video / mp4”,“audio / mp4”,“audio / amr-wb”,等 * / public static final int METADATA_KEY_MIMETYPE = 12; / ** 元数据键,用于检索有关表演者的信息 与数据源关联的艺术家。 * / public static final int METADATA_KEY_ALBUMARTIST = 13; / ** 元数据键,用于检索描述哪个的数字字符串 音频数据源来自的一部分。 * / public static final int METADATA_KEY_DISC_NUMBER = 14; / ** 用于检索音乐专辑编辑状态的元数据键。 * / public static final int METADATA_KEY_COMPILATION = 15; / ** *如果此密钥存在,则媒体包含音频内容。 * / public static final int METADATA_KEY_HAS_AUDIO = 16; / ** 如果此密钥存在,则媒体包含视频内容。 * / public static final int METADATA_KEY_HAS_VIDEO = 17; / ** 如果媒体包含视频,此密钥将检索其宽度。 * / public static final int METADATA_KEY_VIDEO_WIDTH = 18; / ** 如果媒体包含视频,此密钥将检索其高度。 * / public static final int METADATA_KEY_VIDEO_HEIGHT = 19; / ** *此密钥检索平均比特率(以位/秒为单位)(如果可用)。 * / public static final int METADATA_KEY_BITRATE = 20; / ** 此键检索文本轨道的语言代码(如果有)。如果存在多个文本轨迹,则返回值将如下所示: * / public static final int METADATA_KEY_TIMED_TEXT_LANGUAGES = 21; / ** 如果此密钥存在,则媒体受到保护。 * / public static final int METADATA_KEY_IS_DRM = 22; / ** 此密钥检索位置信息(如果有)。 位置应根据ISO-6709标准指定一个mp4 / 3gp的盒子“@xyz”。经度为-90度和纬度的位置 例如,180度的将被检索为“-90.0000 + 180.0000”。 * / public static final int METADATA_KEY_LOCATION = 23; / ** 此键以度为单位检索视频旋转角度(如果可用)。 视频旋转角度可以是0度,90度,180度或270度。 * / public static final int METADATA_KEY_VIDEO_ROTATION = 24; / ** *此键检索原始捕获帧速率(如果是)可用。捕获帧率将是一个浮点号码。 * / public static final int METADATA_KEY_CAPTURE_FRAMERATE = 25; / ** 如果此键存在,则媒体包含静止图像内容。 * / public static final int METADATA_KEY_HAS_IMAGE = 26; / ** *如果媒体包含静止图像,则此密钥将检索该编号静止图像。 * / public static final int METADATA_KEY_IMAGE_COUNT = 27; / ** *如果媒体包含静止图像,则此键将检索图像主图像的索引。 * / public static final int METADATA_KEY_IMAGE_PRIMARY = 28; / ** *如果媒体包含静止图像,则此键检索宽度主图像。 * / public static final int METADATA_KEY_IMAGE_WIDTH = 29; / ** *如果媒体包含静止图像,此键将检索高度主图像。 * / public static final int METADATA_KEY_IMAGE_HEIGHT = 30; / ** *如果媒体包含静止图像,则此键将检索旋转主图像的角度(顺时针方向)。图像旋转角度必须是0度,90度,180度或270度之一。 * / public static final int METADATA_KEY_IMAGE_ROTATION = 31; / ** *如果媒体包含视频且此密钥存在,则会检索视频序列中的总帧数。 * / public static final int METADATA_KEY_VIDEO_FRAME_COUNT = 32;
本文来自博客园,作者:观心静 ,转载请注明原文链接:https://www.cnblogs.com/guanxinjing/p/11057994.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具