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标签 ...
随机推荐
- react杂记
React webpack+react (hello world) 项目结构: src: app.js main.js package.json webpack_dev_config.js 需要安装包 ...
- xampp中localhost与DreamWaver站点设置问题
作为一个初学者,在DreamWaver中配置web服务器用于本地测试,中间碰到了好多问题,百度答案模糊不清,自己摸索出来,把自己碰到的,易错的地方做个总结. step1 : 安装xampp(安装位置记 ...
- 一个有趣的 ”Validation of viewstate MAC failed” 错误的发现和解决
在ASP.NET里面,View State使用较为广泛.它作为一个隐藏字段,可以帮助服务端”记住“客户端的改变,这样客户端 收到服务器对PostBack的响应后,仍然可以展现在PostBack之前设定 ...
- dom4j.jar 的调试方法
1.将jar包的路径写在 classpath下 在cmd窗口中,查看 classpath的内容是否已经加上该路径,win7 下cmd窗口一定要是管理员身份执行 2.在D盘新建一个DOM4JWriter ...
- WPF中的两个绑定场景
1. 如何在诸如ListBox这样的项中绑定父类数据上下文. <ListBox Grid.Row=" ItemsSource="{Binding Entries}" ...
- -moz、-ms、-webkit
1.-moz代表firefox浏览器私有属性 2.-ms代表IE浏览器私有属性 3.-webkit代表safari.chrome私有属性 需要设置这个的样式: transform,border-rad ...
- 浅谈animation里的forwards
forwards可译为向前走, animation-fill-mode(动画填充模式),定义动画播放时间之外的状态 顾名思义,就是在动画播放完了之后给它一个状态 animation-fill-mode ...
- Python 递归、匿名函数、map和filter day4
一.递归---函数自己调用自己 1.一个错误递归的例子: count=0 def hello(): global count count+=1 print("count %s"%c ...
- maven常用dos命令
在平常的开发中可能会经常切换开发中的一些工具,有时就会对一些常用的命令给忘记了 这里特别记录下来方便以后使用: 1.查看maven版本:mvn -c 2.一件构建启动Tomcat:mvn tomcat ...
- 7-20 Windows消息队列 (25 分)(模拟水题)
题意: 思路: 用优先队列直接模拟就OK了,另外优先队列存pair的时候比较的是first的值,实测!! 上代码: #include <iostream> #include <que ...