方法一:
非常简单,系统的api:
public static Bitmap getVideoBitmap(String path) {
Log.e("Icon", "path:" + path);
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
try {
retriever.setDataSource(path);
Bitmap frameAtTime = retriever.getFrameAtTime();
return frameAtTime;
} catch (Exception e) {
return null;
} finally {
retriever.release();
}
}
方法二:
这里在添加一个获取本地视频缩略图的方法,上面的方法一样 亲测可用:(获取的时候记得异步获取,不然会很卡的)
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,这个才是缩略图。
Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(path1, Thumbnails.MINI_KIND);
bitmap = ThumbnailUtils.extractThumbnail(bitmap, 210, 210);
这两种方法都是用来处理Bitmap的大小的,第一个参数是要处理的Bitmap,第二个参数是处理后宽度,第三个是高度,第四个参数options,如果options
定义为OPTIONS_RECYCLE_INPUT,则回收资源。也就是说可以用第三种方法把截取到的视频第一帧的Bitmap转成任意想要的大小,第三个方法还可以获取
内存卡内图片的缩略图。
Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(path1, Thumbnails.MINI_KIND);
bitmap = ThumbnailUtils.extractThumbnail(bitmap, 210, 210);
方法三:
上面的两个方法的话呢,只能获取到系统支持的视屏格式的缩略图,下面看一个在github上利用FFmpeg获取较全面的方法:
https://github.com/wseemann/FFmpegMediaMetadataRetriever
具体使用:
Bitmap bitmap = null;
FFmpegMediaMetadataRetriever fFmpegMediaMetadataRetriever = new FFmpegMediaMetadataRetriever();
fFmpegMediaMetadataRetriever.setDataSource(mUri);
//Bitmap bitmap = fFmpegMediaMetadataRetriever.getFrameAtTime();
Log.d("----->", fFmpegMediaMetadataRetriever.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_AUDIO_CODEC));
byte [] bytes = fFmpegMediaMetadataRetriever.getEmbeddedPicture();
if (bytes != null) {
bitmap = BitmapUtils.decodeSampledBitmapFromResource(bytes, 50, 50);
}
fFmpegMediaMetadataRetriever.release();
return bitmap;
public static Bitmap decodeSampledBitmapFromResource(byte [] bytes,
int reqWidth, int reqHeight) {
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options);
}