永发信息网

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

答案:2  悬赏:50  手机版
解决时间 2021-02-24 22:27
String path1 = Environment.getExternalStorageDirectory().getPath()+"/juyaling.mp4";

MediaMetadataRetriever retriever = new MediaMetadataRetriever();

retriever.setDataSource(path1);
bitmap = retriever.getFrameAtTime(-1);

imageView.setImageBitmap(bitmap);

视频文件放在SD卡根目录下,系统为android6.0的。每次运行到文件读取就显示没有该文件,路径读取无效。为什么呀?
 MediaMetadataRetriever retriever = new MediaMetadataRetriever(); 

 retriever.setDataSource(path1);  
 bitmap = retriever.getFrameAtTime(-1); 

imageView.setImageBitmap(bitmap);

视频文件放在SD卡根目录下,系统为android6.0的。每次运行到文件读取就显示没有该文件,路径读取无效。为什么呀?
最佳答案
从API 8开始,新增了一个类:
android.media.ThumbnailUtils这个类提供了3个静态方法一个用来获取第一帧得到的Bitmap,2个对图片进行缩略处理。
public static Bitmap createVideoThumbnail (String filePath, int kind)

第一个参数是文件的路径,第二个参数是指定图片的大小,有两种选择Thumbnails.MINI_KIND与Thumbnails.MICRO_KIND。
第一种文档上说大小是512 x 384 ,我用一个MP4格式文件测试得到544 x 960,用一个wmv格式文件测试得到160 x 120。明显不靠谱。第二种参数两种格式文件得到的大小都是 96 x 96,这个才是缩略图。extractThumbnail(Bitmap source, int width, int height, int options)
extractThumbnail(Bitmap source, int width, int height)

这两种方法都是用来处理Bitmap的大小的,第一个参数是要处理的Bitmap,第二个参数是处理后宽度,第三个是高度,第四个参数options,如果options定义为OPTIONS_RECYCLE_INPUT,则回收资源。也就是说可以用第三种方法把截取到的第一帧的Bitmap转成任意想要的大小,第三个方法还可以获取内存卡内图片的缩略图。
Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(path1, Thumbnails.MINI_KIND);
bitmap = ThumbnailUtils.extractThumbnail(bitmap, 210, 210);

从API 10开始新增一类MediaMetadataRetriever可以用来获取媒体文件的信息
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource(/sdcard/33.mp4);
Bitmap bitmap = mmr.getFrameAtTime();
image.setImageBitmap(bitmap);
System.out.println(mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DATE)+);
System.out.println(mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE)+);
mmr.release();

MediaMetadataRetriever可以获取任何一帧的缩略图。

public static Bitmap createVideoThumbnail(String filePath) {
// MediaMetadataRetriever is available on API Level 8
// but is hidden until API Level 10
Class clazz = null;
Object instance = null;
try {
clazz = Class.forName(android.media.MediaMetadataRetriever);
instance = clazz.newInstance();

Method method = clazz.getMethod(setDataSource, String.class);
method.invoke(instance, filePath);

// The method name changes between API Level 9 and 10.
if (Build.VERSION.SDK_INT <= 9) {
return (Bitmap) clazz.getMethod(captureFrame).invoke(instance);
} else {
byte[] data = (byte[]) clazz.getMethod(getEmbeddedPicture).invoke(instance);
if (data != null) {
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
if (bitmap != null) return bitmap;
}
return (Bitmap) clazz.getMethod(getFrameAtTime).invoke(instance);
}
} catch (IllegalArgumentException ex) {
// Assume this is a corrupt video file
} catch (RuntimeException ex) {
// Assume this is a corrupt video file.
} catch (InstantiationException e) {
Log.e(TAG, createVideoThumbnail, e);
} catch (InvocationTargetException e) {
Log.e(TAG, createVideoThumbnail, e);
} catch (ClassNotFoundException e) {
Log.e(TAG, createVideoThumbnail, e);
} catch (NoSuchMethodException e) {
Log.e(TAG, createVideoThumbnail, e);
} catch (IllegalAccessException e) {
Log.e(TAG, createVideoThumbnail, e);
} finally {
try {
if (instance != null) {
clazz.getMethod(release).invoke(instance);
}
} catch (Exception ignored) {
}
}
return null;
}
全部回答
可以私聊我~
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
乐府诗集 儒林外史 西游记 世说新语 按顺序排
绥阳县农村信用合作联社营业部我想知道这个在
在这句话中," burn any bridges" 是什么意思
4支足球队单循环赛,每两队多赛一场,每场胜
东亚五环国际南门地址有知道的么?有点事想过
水稳定性是什么意思
浅斟什么的成语
独刺蔚振邦怎么死的
绝味鸭脖草场坡店地址有知道的么?有点事想过
在国际上,法定偿付能力的计算方法有( )。A
大神求中世纪2全面战争原版descr_strat 有的
歌词连着三个“i love you“ 女声。 第三个i
电影饥饿游戏第二部中的一个问题
四级听力对6个,快速阅读对7个,阅读10道题里错
华兴五金水电地址有知道的么?有点事想过去
推荐资讯
用如痴如醉写一段话
湖南国金所怎么样?是个不错的选择吗?
智能电表怎么读?
常熟市明申服装厂在哪里啊,我有事要去这个地
微软surface pro 4怎么更改dns
冰雪奇缘里艾莎是怎么会有魔法
焦虑症躯体症状是什么样子的?麻烦知道的来说
现在差不多22周了,哈市哪里可以做四维啊?
飘香麻辣串我想知道这个在什么地方
【奥运梦想】奥运梦想作文
湖滨银泰地下车库怎么去啊,有知道地址的么
幽默学原理 txt
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?