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


方法一:
非常简单,系统的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);
    }

 




 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值