android 获取网络视频缩略图【完美兼容各版本

来源:互联网 发布:党员干部必知50个名词 编辑:程序博客网 时间:2024/04/29 06:06

android 获取网络视频缩略图【完美兼容各版本】

首先是一个不太完美但非常简洁的解决方案,在多数手机测试通过,目前只有samsung TabletGTP7310未能正常显示,但能通过本文方案二解决。

方案一:感谢@xjxuvup提供

鉴于多数人都用过ThumbnailUtils.createVideoThumbnail()方法,该方法在2.x系统下可用,API LEVEL > 14时却只能返回null,以下为解决该问题方案:

重写createVideoThumbnail()方法,如下

@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)private Bitmap createVideoThumbnail(String url, int width, int height) {    Bitmap bitmap = null;    MediaMetadataRetriever retriever = new MediaMetadataRetriever();    int kind = MediaStore.Video.Thumbnails.MINI_KIND;    try {      if (Build.VERSION.SDK_INT >= 14) {        retriever.setDataSource(url, new HashMap<String, String>());      } else {        retriever.setDataSource(url);      }      bitmap = retriever.getFrameAtTime();    } catch (IllegalArgumentException ex) {      // Assume this is a corrupt video file    } catch (RuntimeException ex) {      // Assume this is a corrupt video file.    } finally {      try {        retriever.release();      } catch (RuntimeException ex) {        // Ignore failures while cleaning up.      }    }    if (kind == Images.Thumbnails.MICRO_KIND && bitmap != null) {      bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,          ThumbnailUtils.OPTIONS_RECYCLE_INPUT);    }    return bitmap;  }

之后再自己的后台线程中调用该方法得到网络视频的缩略图bitmap然后在主线程中调用imageView.setImageBitmap(bitmap)即可;

方案二:

方案一在自己的tablet上测试不通过,于是又在github上找到了另一个扩展版的FFMPEG MediaMetadataRetriever ,提供了一个可以获取视频详细信息和缩略图的统一接口,支持API 7+,(android 自带MediaMetadataRetriever仅支持API 10+),同时支持Uri

,支持的文件类型 file, http, https, mms and mmsh 支持的编码格式(音频&视频): aac, acc+, avi, flac, mp2, mp3, mp4, ogg, 3gp and more! 扩展支持: ICY Metadata (SHOUTcast metadata) 使用方法异常简单,只需将下边的包下载到本地解压然后把libs中的文件拷贝到自己项目的libs目录下即可https://github.com/wseemann/FFmpegMediaMetadataRetriever/blob/master/fmmr-library/prebuilt-libs.tar.gz .

调用:

FFmpegMediaMetadataRetriever fmmr = new FFmpegMediaMetadataRetriever();        try {          fmmr.setDataSource(params[0]);          bitmap = fmmr.getFrameAtTime();          if (bitmap != null) {            Bitmap b2 = fmmr                .getFrameAtTime(                    4000000,                    FFmpegMediaMetadataRetriever.OPTION_CLOSEST_SYNC);            if (b2 != null) {              bitmap = b2;            }            if (bitmap.getWidth() > 640) {// 如果图片宽度规格超过640px,则进行压缩              bitmap = ThumbnailUtils.extractThumbnail(bitmap,                  640, 480,                  ThumbnailUtils.OPTIONS_RECYCLE_INPUT);            }          }        } catch (IllegalArgumentException ex) {          ex.printStackTrace();        } finally {          fmmr.release();        }

这样就可以很方便的获取到缩略图bitmap了。

另:可能有朋友下载了prebuilt-libs.tar.gz之后会惊讶的发现,解压之后的libs文件竟然多达11MB!! 这么庞大的体积对我来说是不能接受的。。。原本2MB的apk瞬间膨胀了5倍之多啊尼玛!

但仔细研究libs一番,发现对于我这种MMR的轻度用户,只需缩略图的功能的话,完全可以简化那些用不到的编码库和多平台库,同时无视mips和x86平台的话,只需libffmpeg_mediametadataretriever_jni.so和fmmr.jar两个文件就可以了,瞬间<30kb了有木有!

其实官方也说了,demo中给的是全部编码格式,可以按照自己的需求重新编译相应编码的lib就可以。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 宝宝不爱吃饭怎么办吃就吐出来 19天的宝宝生理性腹泻怎么办 33天的婴儿生理性腹泻怎么办 两个多月宝宝生理性腹泻怎么办 3岁儿童又吐又拉怎么办 宝宝两岁了突然说话有点口吃怎么办 姜文怎么克服口吃 说话结巴怎么办 慢性咽炎嗓子干哑说话费劲怎么办 感冒后嗓子不疼 说话费劲怎么办 小孩子在幼儿园内向老尿裤子怎么办 五岁宝宝总是抽鼻子有黄鼻涕怎么办 2岁宝宝头有大人的那么大怎么办 一岁四个月宝宝不理人不说话怎么办 两岁七个月还不会说话怎么办 2岁3个月宝宝说话结巴怎么办 两周的宝宝突然说话结巴怎么办 宝宝3岁半了说话口吃怎么办? 四十天的宝宝吐奶严重怎么办 宝宝吐奶从鼻子喷出来怎么办 六个多月宝宝吐奶一股酸味怎么办 50天的宝宝吃了就吐怎么办 微信语音群聊超过9人怎么办 四个月宝宝母乳不够不喝奶粉怎么办 四个月的宝宝母乳不够吃怎么办 火山直播十多天了还都是假人怎么办 吉利汽车锁了后屁股灯还亮怎么办 六个月凶了他突然不说话了怎么办 微信聊天聊的时间长了没话题怎么办 群聊同学加我微信不想加怎么办? 翡翠销售遇到不说话的客人怎么办 4个月宝宝吃手上瘾怎么办 宝宝吃手上瘾拒绝吃奶粉吃奶怎么办 2岁宝宝特别粘人爱哭怎么办 3岁半宝宝突然说话口吃怎么办 2岁3个月宝宝突然说话结巴怎么办 一位特爱说话爱玩的高中生怎么办 猫5天不吃不喝躲起来该怎么办 两个月的小家猫睡觉要黏人睡怎么办 成年的儿子不听话做父母要怎么办 听到孩子上课又不听话想揍他怎么办 18个月小孩脾气很犟怎么办