Android MediaMetadataRetriever和ThumbnailUtils获取视频的关键帧和非关键帧,提取视频封面


MediaMetadataRetriever (硬)

注:提取关键帧要比非关键帧快很多倍

getFrameAtTime参数
方法原型:public Bitmap getFrameAtTime(long timeUs, int option) 

第一个参数
是传入截取时间,只能是us(微秒) 


第二个参数

OPTION_CLOSEST   
在给定的时间,检索最近一个帧,这个帧不一定是关键帧。

OPTION_CLOSEST_SYNC   
在给定的时间,检索最近一个同步与数据源相关联的的帧(关键帧)。

OPTION_NEXT_SYNC  
在给定时间之后检索一个同步与数据源相关联的关键帧。

OPTION_PREVIOUS_SYNC  
在给定时间之前检索一个同步与数据源相关的关键帧

这里为了提取我们想要的帧,不使用关键帧,所以用 OPTION_CLOSEST
public Bitmap getFrameAtTime() 

//如果不加参数的话,提取第一个关键帧
public Bitmap getFrameAtTime() {
        return getFrameAtTime(-1, OPTION_CLOSEST_SYNC);
    }
    
   /**
     * 获取视频文件截图
     *
     * @param path 视频文件的路径
     * @return Bitmap 返回获取的Bitmap
     */
    public Bitmap getVideoThumb(String path) {
        MediaMetadataRetriever media = new MediaMetadataRetriever();
        media.setDataSource(path);
        Bitmap frameAtTime = media.getFrameAtTime(1 * 1000 * 1000, MediaMetadataRetriever.OPTION_CLOSEST);
        if (frameAtTime == null) {
            frameAtTime = media.getFrameAtTime(3 * 1000 * 1000, MediaMetadataRetriever.OPTION_CLOSEST);
        }
        return frameAtTime;
    }

ThumbnailUtils(硬)内部封装了MediaMetadataRetriever

    /**
     * 获取视频文件截图
     *
     * @param path 视频文件的路径
     * @return Bitmap 返回获取的Bitmap
     * MINI_KIND		FULL_SCREEN_KIND		 MICRO_KIND
     */
    public Bitmap getVideoCover(String path) {
        Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(path, MediaStore.Images.Thumbnails.MINI_KIND);
        if (bitmap == null) {
            //提取到的视频封面为空
            showToast("没有提取到的视频封面,请换个视频尝试");
            finish();
        }
        return bitmap;
    }
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值