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

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就可以。

你可能感兴趣的:(视频,网络)