您的位置:首页 > 其它

获取本地视频文件的缩略图

2017-09-07 14:33 1551 查看
方法一:
非常简单,系统的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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  视频缩略图