您的位置:首页 > 其它

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

2014-06-20 09:39 351 查看
From:/article/2160681.html

从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代码

[java]
view plaincopyprint?





Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(path1, Thumbnails.MINI_KIND);
bitmap = ThumbnailUtils.extractThumbnail(bitmap, 210, 210);

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

获取内存卡上图片的缩略图

[java]
view plaincopyprint?





Bitmap pic=BitmapFactory.decodeFile("/sdcard/a.jpg");
pic = ThumbnailUtils.extractThumbnail(pic, 100, 100);

Bitmap pic=BitmapFactory.decodeFile("/sdcard/a.jpg");
pic = ThumbnailUtils.extractThumbnail(pic, 100, 100);
得到的大小是100 x 100.

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

[java]
view plaincopyprint?





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 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可以获取视频任何一帧的缩略图。

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

[java]
view plaincopyprint?





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;
}

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;
}




BitmapRegionDecoder 可以用来裁剪图片,不能处理gif与bmp格式图片。图库用此类来得到用于显示全屏的图片。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: