Android之使用MediaMetadataRetriever类获取视频第一帧
一.首先,来介绍一下MediaMetadataRetriever类,此类位于android.media包下,这里,先附上可查看此类的API地址:MediaMetadataRetriever类。大家能够自行查看。
1.MediaMetadataRetriever类概述:MediaMetadataRetriever class provides a unified interface for retrieving frame and meta data from an input media file.
翻译过来是Mediametadataretriever类提供了一个统一的接口取回帧和取回从一个输入媒体文件里的元数据。
2.MediaMetadataRetriever类提供的常量:MediaMetadataRetriever类提供的常量有非常多。都是int常量,有些用来取得媒体文件的元数据,有些用来对获得视频的帧的操作,这里大家能够查看API,这里列举几个常量:
第一个是获得我们设置的媒体文件的专辑标题,第二个是获得我们设置的媒体文件的专辑艺术家,第三个获得我们设置的媒体文件的艺术家,第四个获得我们设置的媒体文件的作者。
3.MediaMetadataRetriever类的构造方法:MediaMetadataRetriever() 无參构造方法。
4.MediaMetadataRetriever类的公有方法。例如以下图所看到的:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">
大家能够依据解释来知道这些方法的用处。当中一经常使用的方法为setDataSource方法。用来设置数据源,当中这个数据源能够从文件的路径,文件描写叙述符,uri地址和Uri对象来设置。
另外一经常使用的方法getFrameAtTime方法,用来获取帧,返回一个Bitmap对象,当中能够获取到第一帧和多少时间后的帧。
二.此篇文章主要是介绍怎样使用MediaMetadataRetriever类获取视频第一帧的,在编写我们的Android项目之前。还是要做下面三个步骤:
1.开启Android模拟器。
2.打开视图File Explorer,即展示Android模拟器中文件文件夹和文件,当中,必须注意的是Android模拟器的版本号问题,版本号不同存放在SD卡的位置也不同。Android2.x系统SD卡存放的位置为/mnt/sdcard或者/sdcard,而Android4.x系统SD卡存放的位置为/storage/sdcard/。
3.接着就把我们的视频文件放入SD卡的位置上。我的模拟器版本号为4.x的,所以就在下图的位置存放视频文件:
假设你存放的文件文件夹是没有权限放入文件的。就会在控制台输出红色警告。没有权限。
三.以下,就能够编写我们的Android项目,新建一个项目android_mediaMetadataRetriever:
1.打开我们的布局文件activity_main.xml,代码例如以下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/ic_launcher"/> <Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="获取视频缩略图"/> </LinearLayout>
2.打开我们的MainActivity.java文件。代码例如以下:
package com.android_mediametadataretriever; import java.io.File; import android.app.Activity;
import android.graphics.Bitmap;
import android.media.MediaMetadataRetriever;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast; public class MainActivity extends Activity { private ImageView imageView;//声明ImageView对象
private Button button;//声明Button对象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView=(ImageView)findViewById(R.id.imageView);//获取布局管理器中的ImageView控件
button=(Button)findViewById(R.id.button);//获取布局管理器中的Button控件
//设置按钮点击事件监听器
button.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
MediaMetadataRetriever mmr=new MediaMetadataRetriever();//实例化MediaMetadataRetriever对象
File file=new File("/storage/sdcard/Movies/music1.mp4");//实例化File对象,文件路径为/storage/sdcard/Movies/music1.mp4
if(file.exists()){
mmr.setDataSource(file.getAbsolutePath());//设置数据源为该文件对象指定的绝对路径
Bitmap bitmap=mmr.getFrameAtTime();//获得视频第一帧的Bitmap对象
if(bitmap!=null){
imageView.setImageBitmap(bitmap);//设置ImageView显示的图片
Toast.makeText(MainActivity.this, "获取视频缩略图成功", Toast.LENGTH_SHORT).show();//获取视频缩略图成功,弹出消息提示框
}else{
Toast.makeText(MainActivity.this, "获取视频缩略图失败", Toast.LENGTH_SHORT).show();//获取视频缩略图失败,弹出消息提示框
}
}else{
Toast.makeText(MainActivity.this, "文件不存在", Toast.LENGTH_SHORT).show();//文件不存在时。弹出消息提示框
}
}
});
} }
当中上面代码中的File对象指定的路径为Android 4.x系统的SD卡路径下的文件夹,假设是较低版本号。还是要看下File Explorer视图的SD卡路径是哪个。当中/mnt/sdcard文件夹和/sdcard文件夹都属于/storage/sdcard文件夹的连接文件。所以真实存放路径为/storage/sdcard。
3.最后。千万记得一点,要在AndroidManifest.xml声明文件加入我们的许可。即权限。在此文件加上一行读取SD卡文件的权限代码就可以,代码例如以下:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
注:当中必须注意的是使用MediaMetadataRetriever类要求android的minSdkVersion最小为14,所以假设你的AndroidManifest.xml文件里的android:minSDKVersion="8"即最小的sdk版本号小于14的话,将会报错,解决的方法能够在AndroidManifest.xml文件里改最小sdk版本号,也能够在MainActivity类中加上以下的代码:
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
使得我们使用这个MediaMetadataRetriever类不会报错。
四.部署此项目到Android模拟器,执行效果例如以下:
点击获取视频缩略图button,例如以下图所看到的:
五.以上内容仅供大家学习參考,写得不好。请见谅,如有错误,请指出。谢谢!
Android之使用MediaMetadataRetriever类获取视频第一帧的更多相关文章
- Android之使用MediaMetadataRetriever类获取媒体信息
一.昨天.介绍了使用MediaMetadataRetriever类来获取视频第一帧:http://blog.csdn.net/u012561176/article/details/47858099,今 ...
- Android -- 获取视频第一帧缩略图
干货 从API 8开始,新增了一个类: android.media.ThumbnailUtils这个类提供了3个静态方法一个用来获取视频第一帧得到的Bitmap,2个对图片进行缩略处理. public ...
- 关于video标签移动端开发遇到的问题,获取视频第一帧,全屏,自动播放,自适应等问题
最近一直在处理video标签在IOS和Android端的兼容问题,其中遇到不少坑,绝大多数问题已经解决,下面是处理问题经验的总结: 1.获取视频的第一帧作为背景图: 技术:canvas绘图 windo ...
- 通过 ffmpeg 获取视频第一帧(指定时间)图片
最近做一个上传教学视频的方法,上传视频的同时需要上传视频缩略图,为了避免用户上传的缩略图与视频内容不符,经理要求直接从上传的视频中截图视频的某一帧作为缩略图,并给我推荐了FFMPEG.FFMPEG 功 ...
- javacv获取视频第一帧
第一种是用ffmpeg工具,不过还得安装客户端软件,于是放弃了,还有一种是javacv开源工具,所以选择第二种: 第一种:ffmpeg工具 需要安装ffmpeg软件,支持windows和linux,视 ...
- python cv2获取视频第一帧,并转码
安装Python库 sudo pip install opencv-python 或者sudo pip install opencv-python -i https://pypi.douban.com ...
- Android视频处理 --处理视频第一帧缩略图
从API 8开始,新增了一个类: android.media.ThumbnailUtils这个类提供了3个静态方法一个用来获取视频第一帧得到的Bitmap,2个对图片进行缩略处理. ? 1 publi ...
- Android必知必会-获取视频文件的截图、缩略图
背景 公司最近要求给我负责的APP加上视频录制和发布的功能,我简单的完成了基本的录制和视频压缩功能,后来发现发布接口需要上传视频的截图,网上搜索了一下资料,在这里整理一下. 代码实现 /** * 获取 ...
- vue 截取视频第一帧
最近自己写项目,在项目中涉及功能点又截取视频帧的点:需求澄清:移动端封面展示,平台上传图片(多张上传)取第一张上传图片为封面图:如上传视频则截取视频第一帧作为封面图: 实现思路:h5 video标签 ...
随机推荐
- Android基础TOP2:单机按钮改变字体颜色
---恢复内容开始--- Activity: <TextView android:id="@+id/t1" android:textSize="30dp" ...
- 错误处理:vmware下克隆centos7配置静态ip地址网卡问题
vmware下克隆centos7,在配置静态ip地址,重启网卡存在问题,还是mac地址问题 ip addr show 查看下mac地址,配置文件修改下,重启网卡正常了
- Java并发——阿里架构师是如何巧用线程池的!
一.创建线程 1.创建普通对象,只是在JVM的堆里分配一块内存而已 2.创建线程,需要调用操作系统内核的API,然后操作系统需要为线程分配一系列资源,成本很高 线程是一个重量级对象,应该避免频繁创建和 ...
- 2018年为什么要学习Python?Python还有前景吗?
近年来,Python一直是当仁不让的开发入行首选,无论是职位数量.就业广度还是使用排行都远超其他语言,而且Python语言接近自然语言,学习起来非常的轻松简便,因此也越来越受到人们的欢迎.进入到201 ...
- asp网站中使用百度ueditor教程.txt
1.根据网站类型及编码选择相应的ueditor版本,如我的网站编码为gb2312,则选择ueditor 1.43 asp gbk版.2.本机IE浏览器应为8.0或以上,8.0以下的ueditor 1. ...
- JavaScript day4(逻辑运算符)
逻辑运算符 逻辑运算符用于测定变量或值之间的逻辑 逻辑与运算符:&&.同时满足(and). 通过if语句的嵌套来实现: if (num > 5) { if (num < 1 ...
- copy and rename a file multiple times using Matlab
for file.txt***********n=10;fileinfo=importdata('file.txt');for i=1:nfilename=sprintf('file_%d.txt', ...
- Django——6 模型基础ORM 数据库连接配置 模型的创建与映射 数据的增删改查
Django Django的ORM简介 数据库连接配置 模型的创建与映射 数据库的增删改查 增数据 查数据及补充 改数据 删数据 Django的ORM系统分析 ORM概念:对象关系映射(Objec ...
- 【codeforces 510C】Fox And Names
[题目链接]:http://codeforces.com/contest/510/problem/C [题意] 给你n个字符串; 问你要怎么修改字典序; (即原本是a,b,c..z现在你可以修改每个字 ...
- [luoguP1993] 小 K 的农场(差分约束 + spfa 判断负环)
传送门 差分约束系统..找负环用spfa就行 ——代码 #include <cstdio> #include <cstring> #include <iostream&g ...