MediaMetadataRetriever小试牛刀

Android多媒体框架之MediaMetadataRetriever MediaMetadataRetriever是Android原生提供的获取音视频文件信息的一个类,我们可以通过这个类的相关方法获取一些基本信息,如视频时长、宽高、帧率、方向、某一帧的图片等。 初始化 MediaMetadataRetriever retriever = new MediaMetadataRetriever(); retriever.setDataSource("");//设置视频路径 基本信息 (1)public String extractMetadata (int k 阅读详情

           最近项目有用到音视频的录制,那么自然也是有获取录制的音视频信息的需求,同时也会有获取网络视频信息的需求了。

           其实说来获取录制时长的话,完全可以不从文件本身入手了。可以放个计时器。不过这样子也是大动干戈,也太不灵活了。然后就遇到了今天的主角了:MediaMetadataRetriever。看google对于这个类的描述MediaMetadataRetriever class provides a unified interface for retrieving frame and meta data from an input media file.大意为MediaMetadataRetriever提供了一个统一的接口用于获取输入的媒体文件的框架和元数据(英文不好,多多包涵)。可能大意就是这个类可以用于获取输入媒体文件的一些信息吧。

           其实我主要是用到了该类的两个功能了,一个是获取音视频的时长,另外一个就是获取视频某一帧的缩略图。具体看下如下代码:

     以下的NETWORK和LOCAL只是我自己定义的常量而已啦。
//根据url获取音视频时长,返回毫秒
    public long getDurationLong(String url,int type){
        String duration = null;
        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
        try {
            //如果是网络路径
            if(type == NETWORK){
                retriever.setDataSource(url,new HashMap<String, String>());
            }else if(type == LOCAL){//如果是本地路径
                retriever.setDataSource(url);
            }
            duration = retriever.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_DURATION);
        } catch (Exception ex) {
            LogUtils.e(ex);
            LogUtils.d("nihao", "获取音频时长失败");
        } finally {
            try {
                retriever.release();
            } catch (RuntimeException ex) {
                LogUtils.e(ex);
                LogUtils.d("nihao", "释放MediaMetadataRetriever资源失败");
            }
        }
        if(!TextUtils.isEmpty(duration)){
            return Long.parseLong(duration);
        }else{
            return 0;
        }
    }
    
    //获取视频缩略图
    private Bitmap createVideoThumbnail(String url, int type) {
        Bitmap bitmap = null;
        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
        try {
            //将网络文件以及本地文件区分开来设置
            if (type == NETWORK) {
                retriever.setDataSource(url, new HashMap<String, String>());
            } else if(type == LOCAL){
                retriever.setDataSource(url);
            }
            bitmap = retriever.getFrameAtTime(0, MediaMetadataRetriever.OPTION_NEXT_SYNC);
        } catch (IllegalArgumentException ex) {
            LogUtils.e(ex);
            LogUtils.d("nihao", "获取视频缩略图失败");
        } finally {
            try {
                retriever.release();
            } catch (RuntimeException ex) {
                LogUtils.e(ex);
                LogUtils.d("nihao", "释放MediaMetadataRetriever资源失败");
            }
        }
        return bitmap;
    }

其实他俩基本一致只是获取音频用的是extractMetadata,而获取视频缩略图用的是getFrameAtTime;其实重点在于两个方法都对于传入的url进行了是否是网络的判断,那么接下来我们看看传入不同参数的setDataSource有什么不同吧,官方解释如下:


这个是我用于获取本地文件信息的方法,可以看下我标红的地方,path的定义是你传入的媒体问题的路径,所以就应该是对应的本地文件路径了。但是如果路径无效是会抛出异常的。


这个是我用于获取网络视频信息的方法,也可以看下我标红的部分,这个方法是从android 4.0才开始有的。另外那个第二个参数是请求数据时候携带的头信息。但是我这里没有做特殊的设置了。就传递了一个map对象;

上面是我最终的方法。但是一开始其实不是这个样子的,一开始我是没有区分网络路径和本地路径的。我只是加了sdk版本的区分而已,就是如果是4.0及其以上我用了第二个方法。在很多手机上面也没有事儿,包括本地以及网络的。可是后来用了小米4的6.0系统,以及华为mate7的6.0系统后,发现用两个参数的方法是无法获取到本地视频的信息的,会抛出illegalState的异常。因为我的apk的最低安装版本就是4.0所以其实我的判断就永远会走进两个参数的方法里面的。

        总结一下就是两个参数的方法大多数情况下既可以获取网络音视频信息,也可以获取本地音视频信息。但是在有的手机上无法获取本地视频信息。所以就要用到一个参数的方法获取本地音视频信息,且一个参数是不支持获取网络音视频信息的。所以最终就有了上面的代码。

        以上如有不对之处,欢迎批评指正。

深入解析 `MediaMetadataRetriever` 的技术架构与通信原理 Java 层:提供面向开发者的 API,如和。JNI 层:作为 Java 层和 C++ 层的桥梁,负责跨语言调用和数据传递。C++ 层:实现核心功能,包括媒体文件的解析、帧捕获和元数据提取。是 Android 平台中处理媒体文件的重要组件,其技术架构和通信原理涉及 Java 层、JNI 层和 C++ 层的紧密协作。通过深入理解其内部实现,开发者可以更好地利用该组件,并优化其应用程序的性能和功能。希望本文能为开发者提供有价值的参考,助力其在 Android 媒体处理领域的探索与实践。 阅读详情

相关推荐

android 音乐信息乱码处理

关于android 音乐乱码的问题,估计很多人都为此头疼。。可能会为你带来些帮助! public static MusicBean fileToMusic(File file) { if (file.length() == 0) return null; MediaMetadataRetriever metadataRetriever =...

Fan 1858

MediaMetadataRetriever类、方法以及使用详解

MediaMetadataRetriever类简单介绍 (1)属于在android api的那个包下:`android.media.MediaMetadataRetriever` (2)类简单介绍: MediaMetadataRetriever类提供了用于从输入媒体文件检索帧和元数据的统一接口。 (3)这个是android提供的类,用来获取本地和网络media相关文件的信息 MediaMet...

alpgao的博客 1万+

Android视频缩略图提取:MediaMetadataRetriever实战指南

是 Android 中一个用于提取媒体文件信息(如音视频元数据)的实用工具类。其定义位于包中。通过这个类,开发者可以轻松地获取媒体文件的帧、时长、元数据等信息,而无需关心文件格式和编解码器的细节。该类的主要功能包括:- 提取音频和视频文件的帧。- 获取音视频文件的元数据信息。- 从远程媒体流中提取帧。这个类提供了多种有用的方法,以下是几个常见的方法及其功能::设置媒体数据源,可以是本地文件路径或URI。:设置媒体数据源,通过Context和Uri。

weixin_32836713的博客 1421

Android音视频开发 - MediaMetadataRetriever 相关

MediaMetadataRetriever 是android中用于从媒体文件中提取元数据新的类. 可以获取音频,视频和图像文件的各种信息,如时长,标题,封面等.

赵航的博客 8175

运算放大器多谐振荡器设计实战:从施密特触发器到波形生成

本文详细介绍了运算放大器在多谐振荡器设计中的实战应用,涵盖施密特触发器的迟滞比较原理、非稳态振荡器的自激机制以及单稳态和双稳态电路的设计技巧。通过具体案例和参数计算,帮助工程师掌握波形生成与信号处理的核心技术,提升电路设计效率与稳定性。

pz89012345的博客 217

服务器AutoDL自己部署QWen3

说明:核心参数:30B 模型原精度权重文件约 60GB,单张 PRO 6000 拥有 48GB 显存,单卡塞不下原精度模型,2张 PRO 6000 = 96GB 总显存,这不仅能装下模型,还能留出约 30GB 显存给 KV Cache(上下文长度) 以及 Omni 多模态组件 处理图片/视频输入时的额外开销。1. 前提准备模型选择:直接下载到 AutoDL 服务器上=》原精度模型(BF16/FP16) 的 Qwen3-Omni-30B,选择的示例和环境如下。# 3. 正式执行模型下载。

xiaoxiao_00001的博客 414

Android 音视频汇总

标题标题基础 Android视频开发进阶(part1-关于视频的那些术语) Android视频开发进阶(part2-MP4文件的解析) - 重点内容 - 基于surfaceview与mediaplayer的视频播放器(android-studio) - MediaPlayer和VideoView的使用 - Android多媒体学习十二:Android中Video的三种播放方式的实现

ThePromonkeyOf_HeLuo的博客 851

Oracle到金仓数据库信创改造迁移实施规划方案

**性能测试和优化**:对金仓数据库的性能进行测试,根据业务负载情况进行必要的调优,确保系统能够稳定高效运行。- **数据兼容性**:评估Oracle数据库中的数据结构和金仓数据库的兼容性,明确需要重构的数据模型。- **性能测试**:通过对金仓数据库的性能测试,预估在实际业务环境下的表现,是否能达到业务需求。- **工具选择**:选择适合的迁移工具,如金仓数据库提供的迁移工具,能够提升迁移效率和准确性。- **全面迁移**:在初步迁移成功后,进行全面数据迁移,确保所有数据完整迁移到金仓数据库上。

hdrhdrjdididrr的博客 480

音视频开发系列(3)——全面了解Android MediaMetadataRetriever

该方法用于设置MediaMetadataRetriever要提取信息的数据源,path可以是本地文件路径或者网络URL地址。该方法用于提取指定的元数据信息,参数keyCode可以是预定义的一些常量,例如METADATA_KEY_TITLE表示音频的标题,METADATA_KEY_ARTIST表示音频的演唱者等等。其中,参数keyCode代表要提取的元数据信息类型,可以是预定义的一些常量值,也可以是自定义的键值。

一个码农的博客 2109

SNAP计算哨兵二号的叶面积指数(LAI)

对于哨兵二号数据以及LANDSAT8数据,SNAP提供已经集成好的模块计算LAI。在Optical->Thematic Land Processing->Biopyhsical Processor目录下面。 对于经过Sen2Cor处理好的数据,需经过重采样才可进行计算。重采样工具在Raster->Geometric->Resampling。 如果选择Biopyhsical Processor S2_10m进行计算,需要将所有的波段都重采样为10米(哨兵二号的第二波段为10米,可据此波

gxwwww的博客 9417

比亚迪唐/秦开发者必看:253个车辆接口实战指南(附常用功能调用示例)

本文为比亚迪唐/秦开发者提供了一份详尽的车辆接口实战指南。文章聚焦于比亚迪开放的253个车辆接口,从开发环境搭建、核心状态监控到高频控制功能(如空调与充电管理),结合真实代码示例,帮助开发者快速上手并规避常见问题,高效开发车载应用。

weixin_28327051的博客 606

MediaMetadataRetriever

MediaMetadataRetriever是Android原生提供的获取音视频文件信息的一个类,我们可以通过这个类的相关方法获取一些基本信息,如视频时长、宽高、帧率、方向、某一帧的图片等。

yinzhijiezhan的专栏 1007

Halcon像素比例标定(误差大)-相机标定

一种简易标定: 像素比例标定,如果需要精确一些则需要在高度和宽度上都需要计算,然后求出比例系数。需要高精度标定板和相机,以及多次标定才能达到稳定的状态,这种标定简单,但是误差大。 read_image (Img0008, 'D:/00项目代码/000视觉软件/02Halocn算法20190501/04测量20190424/07_比例计算测量标定/IMG0008.jpg') rgb1_to_...

SSSS的博客 3984

MediaMetadataRetriever的用法

【代码】MediaMetadataRetriever的用法。

yinzhijiezhan的专栏 758

2026年全国青少年信息素养大赛算法应用主题赛C++样题及答案解析

2026年全国青少年信息素养大赛算法应用主题赛C++样题

王老师青少年编程 3713

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Android MediaMetadataRetriever的基础使用

MediaMetadataRetriever 读取多媒体元数据 —获取视频时长 音乐播放器通常需要获取歌曲的专辑、作者、标题、年代等信息,将这些信息显示到UI界面上,Android 提供统一的接口 MediaMetadataRetriever 解析媒体文件。 http://www.android-doc.com/reference/android/media/MediaMetadataRetriever.html String absolutePath = "/sdcard/sample.mp3"; M.

特立独行的博客 4783

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Android MediaMetadataRetriever类

获取视频信息 获取视频图片 MediaMetadataRetriever retriever = new MediaMetadataRetriever(); retriever.setDataSource(filePath); // 设置视频位置 Bitmap bmp = retriever.getFrameAtTime(); // 视频第一帧图像 获取视频宽高,可以通过图像,也可以通过extr...

假装你是大灰狼的专栏 1002

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Android之使用MediaMetadataRetriever类获取视频第一帧

一.首先,来介绍一下MediaMetadataRetriever类,此类位于android.media包下,这里,先附上可查看此类的API地址:MediaMetadataRetriever类,大家可以自行查看。 1.MediaMetadataRetriever类概述:MediaMetadataRetriever class provides a unified interface for ret

茕夜 2万+

VideoView(播放视频),MediaMetadataRetriever(获取视频截图)视频路径

VideoView组件要播放的视频如果放在Raw文件夹中,则视频路径为: String videoPath = "android.resource://" + getPackageName() + "/" + R.raw.sleep_cat; videoView.setVideoPath(videoPath); MetaDataretriever获取视频截图时视频文件如果也放在Raw文件夹中...

CFPP_45的博客 1920

Android使用FFmpegMediaMetadataRetriever获取视频缩略图

文章目录1. 使用MediaMetadataRetriever获取视频元数据2. 使用FFmpegMediaMetadataRetriever获取视频元数据(缩略图)2.1 集成方法2.1.1 使用gradle配置依赖。2.1.2 使用aar包2.2 代码里使用FFmpegMediaMetadataRetriever3. 完整代码4. 运行效果 1. 使用MediaMetadataRetrieve...

fxjzzyo的博客 9997

【Android】使用 MediaMetadataRetriever 获取视频信息

1 环境配置与初始化 (1)申请权限 在 AndroidManifest.xml 中的 manifest 标签(application 同级标签)下添加外部存储读写权限,如下: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /&gt

little_fat_sheep 6179

什么?用MediaMetadataRetriever导致ANR了?看这里

需求:项目要求获取网络视频并获取视频第一帧展示在页面上 操作:简单,直接百度搜索,获悉 MediaMetadataRetriever retriever = new MediaMetadataRetriever(); retriever.setDataSource(params[0], new HashMap&lt;String, String&gt;());//这里插嘴,这个是获取网络...

fengchao1993的博客 2503

Android-视频缩略图的获取

1、前言:   我们用手机录制一个视频之后,点开相册等APP,在不点开播放的时候也可以看到视频的第一帧,这就是视频的缩略图。安卓中具体怎么获取视频的缩略图呢?本文将一一揭晓。 2、视频缩略图获取过程:   首先我们看看APP怎么调用的 APP的调用很简单,直接用createVideoThumbnail函数即可。下面看看这个函数的具体实现。 frameworks/base/medi...

cheriyou_的博客 3408
上一篇: 七牛云文件上传
下一篇: 关于视频录制的一些尝试
和小胖
博客等级 码龄12年 8粉丝 42原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值