Android使用MediaMetadataRetriever类获取视频帧时一直无法正确读取路径文件,iamge显示位null

android 获取视频帧
android 获取视频帧
发布时间: 13:22:48
编辑:www.fx114.net
本篇文章主要介绍了"android 获取视频帧",主要涉及到android 获取视频帧方面的内容,对于android 获取视频帧感兴趣的同学可以参考一下。
今天做android视频文件解码,需求:从一个视频文件获取到一帧一帧的图片。
总结如下:
首先看代码:
MediaDecoder.java
import android.graphics.B
import android.media.MediaMetadataR
import android.util.L
public class MediaDecoder {
private static final String TAG = &MediaDecoder&;
private MediaMetadataRetriever retriever =
private String fileL
public MediaDecoder(String file) {
if(CommonUtils.checkFile(file)){
retriever = new MediaMetadataRetriever();
retriever.setDataSource(file);
fileLength = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
Log.i(TAG, &fileLength : &+fileLength);
* 获取视频某一帧
* @param timeMs 毫秒
* @param listener
public boolean decodeFrame(long timeMs,OnGetBitmapListener listener){
if(retriever == null)
Bitmap bitmap = retriever.getFrameAtTime(timeMs * 1000, MediaMetadataRetriever.OPTION_CLOSEST);
if(bitmap == null)
listener.getBitmap(bitmap, timeMs);
* 取得视频文件播放长度
public String getVedioFileLength(){
return fileL
}这里是获取视频帧工具,调试的时候遇到一些问题:
其中一个是getFrameAtTime参数的使用,先看方法原型:public Bitmap getFrameAtTime(long timeUs, int option) 第一个参数是传入时间,只能是us(微秒) ,当时我传入的ms,获取的总是第一帧,所以这个问题都弄了好久。
然后是第二个参数,先看看官方解释:
& 在给定的时间,检索最近一个帧,这个帧不一定是关键帧。
在给定的时间,检索最近一个同步与数据源相关联的的帧(关键帧)。
&在给定时间之后检索一个同步与数据源相关联的关键帧。
顾名思义,同上
这里为了提取我们想要的帧,不使用关键帧,所以用 OPTION_CLOSEST .
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:android使用 MediaMetadataRetriever 获取视频文件的 总时长 和视频的分辨率。根据该方式获取视频信息可以看出不仅仅可以获取时长和分辨率,还能获取到其他的一些视频信息,不错还是很强大的,不用自己去解析mp4文件了。此demo只是获取的mp4文件,其他的多媒体文件也可以获取到相应信息,比如mp3; private void
getPlayTime(String mUri)
android.media.MediaMetadataRetriever mmr = new android.media.MediaMetadataRetriever();
if (mUri != null)
HashMap&String, String& headers =
if (headers == null)
headers = new HashMap&String, String&();
headers.put("User-Agent", "Mozilla/5.0 (L U; Android 4.4.2; zh-CN; MW-KW-001 Build/JRO03C) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/1.0.0.001 U4/0.8.0 Mobile Safari/533.1");
mmr.setDataSource(mUri, headers);
//mmr.setDataSource(mFD, mOffset, mLength);
String duration = mmr.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_DURATION);//时长(毫秒)
String width = mmr.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH);//宽
String height = mmr.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT);//高
Toast.makeText(MainActivity.this, "playtime:"+ duration+"w="+width+"h="+height, Toast.LENGTH_SHORT).show();
} catch (Exception ex)
Log.e("TAG", "MediaMetadataRetriever exception " + ex);
} finally {
mmr.release();
转载地址:http://blog.csdn.net/lzy0168/article/details/(作者好像不让转。。。)
如果您想留下此文,您可以将其发送至您的邮箱(将同时以邮件内容&PDF形式发送)
相关文章推荐
(Ctrl+Enter提交) &&
已有0人在此发表见解
&在& 15:05收藏到了
&&在信息爆炸的时代,您的知识需要整理,沉淀,积累!Lai18为您提供一个简单实用的文章整理收藏工具,在这里您可以收藏对您有用的技术文章,自由分门别类,在整理的过程中,用心梳理自己的知识!相信,用不了多久,您收藏整理的文章将是您一生的知识宝库!
· 蜀ICP备号-1问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
使用手机自带的摄像功能得到视频,怎么得到视频某一帧并转为图片
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
其实Android一直有一个这么视频工具类的
但是文档上说是API 10 之后才能使用的,但是其实之前都是一直存在的。
你可以用反射的方法去访问这个类。
但是有一个区别,在2.3.3也就是API 10 之后才有getFrameAtTime的方法,而之前是没有的,即使你用反射也访问不到。
所以你可以把app的minSDK设置为2.3.3
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
楼上提到的mediaretriever接口依赖于具体设备的解码器实现。我在ics的一个设备上使用过这个接口,它每次返回都是同一帧。推荐使用ffmpeg或者vitamio封装的mediaretriever来保证跨多个android版本。
同步到新浪微博
分享到微博?
你好!看起来你挺喜欢这个内容,但是你还没有注册帐号。 当你创建了帐号,我们能准确地追踪你关注的问题,在有新答案或内容的时候收到网页和邮件通知。还能直接向作者咨询更多细节。如果上面的内容有帮助,记得点赞 (????)? 表示感谢。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
扫扫下载 App}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信