获取视频和图片缩略图 与媒体信息

从android 2.2也就是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,第二个参数是处理后宽度,第三个是高度,第四个我也不知道。也就是说可以用第三种方法把截取到的视频第一帧的Bitmap转成任意想要的大小,第三个方法还可以获取内存卡内图片的缩略图。


获取第一帧Bitmap代码

  1. Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(path1, Thumbnails.MINI_KIND);  
  2. bitmap = ThumbnailUtils.extractThumbnail(bitmap, 210210);  
得到的大小是210 X 210。

获取内存卡上图片的缩略图
  1. Bitmap pic=BitmapFactory.decodeFile("/sdcard/a.jpg");  
  2. pic = ThumbnailUtils.extractThumbnail(pic, 100100);  
得到的大小是100 x 100.


从API 10开始新增一类MediaMetadataRetriever可以用来获取媒体文件的信息

  1. MediaMetadataRetriever mmr = new MediaMetadataRetriever();  
  2. mmr.setDataSource("/sdcard/33.mp4");  
  3. Bitmap bitmap = mmr.getFrameAtTime();  
  4. image.setImageBitmap(bitmap);  
  5. System.out.println(mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DATE)+"");  
  6. System.out.println(mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE)+"");  
  7. mmr.release();  

可以获取视频文件的第一帧与媒体文件的部分定义了的头信息。

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


附上一段4.2图库里用反射获取视频第一帧的代码,很明显,针对所有版本

  1. public static Bitmap createVideoThumbnail(String filePath) {  
  2.     // MediaMetadataRetriever is available on API Level 8  
  3.     // but is hidden until API Level 10  
  4.     Class<?> clazz = null;  
  5.     Object instance = null;  
  6.     try {  
  7.         clazz = Class.forName("android.media.MediaMetadataRetriever");  
  8.         instance = clazz.newInstance();  
  9.   
  10.         Method method = clazz.getMethod("setDataSource", String.class);  
  11.         method.invoke(instance, filePath);  
  12.   
  13.         // The method name changes between API Level 9 and 10.  
  14.         if (Build.VERSION.SDK_INT <= 9) {  
  15.             return (Bitmap) clazz.getMethod("captureFrame").invoke(instance);  
  16.         } else {  
  17.             byte[] data = (byte[]) clazz.getMethod("getEmbeddedPicture").invoke(instance);  
  18.             if (data != null) {  
  19.                 Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);  
  20.                 if (bitmap != nullreturn bitmap;  
  21.             }  
  22.             return (Bitmap) clazz.getMethod("getFrameAtTime").invoke(instance);  
  23.         }  
  24.     } catch (IllegalArgumentException ex) {  
  25.         // Assume this is a corrupt video file  
  26.     } catch (RuntimeException ex) {  
  27.         // Assume this is a corrupt video file.  
  28.     } catch (InstantiationException e) {  
  29.         Log.e(TAG, "createVideoThumbnail", e);  
  30.     } catch (InvocationTargetException e) {  
  31.         Log.e(TAG, "createVideoThumbnail", e);  
  32.     } catch (ClassNotFoundException e) {  
  33.         Log.e(TAG, "createVideoThumbnail", e);  
  34.     } catch (NoSuchMethodException e) {  
  35.         Log.e(TAG, "createVideoThumbnail", e);  
  36.     } catch (IllegalAccessException e) {  
  37.         Log.e(TAG, "createVideoThumbnail", e);  
  38.     } finally {  
  39.         try {  
  40.             if (instance != null) {  
  41.                 clazz.getMethod("release").invoke(instance);  
  42.             }  
  43.         } catch (Exception ignored) {  
  44.         }  
  45.     }  
  46.     return null;  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值