如何从视频路径中显示视频缩略图?

问题描述 投票:2回答:4

我想在存储的视频路径中显示ImageView中的视频缩略图。是否有一个函数采用视频路径并返回缩略图的位图?我通过以下代码获取视频路径:

public ArrayList<String> getAllMedia() {
  HashSet<String> videoItemHashSet = new HashSet<>();
  String[] projection = {MediaStore.Video.VideoColumns.DATA, MediaStore.Video.Media.DISPLAY_NAME};
  Cursor cursor = getContext().getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, projection, null, null, null);
  try {
    cursor.moveToFirst();
    do {
      videoItemHashSet.add((cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA))));
    } while(cursor.moveToNext());
    cursor.close();
  } catch(Exception e) {
    e.printStackTrace();
  }
  ArrayList<String> downloadedList = new ArrayList<>(videoItemHashSet);
  return downloadedList;
}
android file imageview android-bitmap video-thumbnails
4个回答
4
投票

这是创建缩略图的默认方式。

迷你型

Bitmap thumb;
//MINI_KIND, size:  512 x 384 thumbnail 
    thumb = ThumbnailUtils.createVideoThumbnail(filePath, MediaStore.Video.Thumbnails.MINI_KIND);
            img_tumbnail.setImageBitmap(thumb);

对于Micro Kind

Bitmap thumb;
//MICRO_KIND, size: 96 x 96 thumbnail
thumb= ThumbnailUtils.createVideoThumbnail(filePath, Thumbnails.MICRO_KIND);
img_tumbnail.setImageBitmap(thumb);

此外,您可以使用Glide for Url以及Device的视频路径。

Glide.with(context).with(this)
                    .asBitmap()
                    .load(videoFilePath) // or URI/path
                    .into(imgView); //imageview to set thumbnail to

另外,你可以使用.override(50,50)Glide来调整缩略图的大小。


1
投票

使用Glide lib

显示本地存储的缩略图

String filePath = "/storage/emulated/0/Pictures/example_video.mp4";

GlideApp  
    .with(context)
    .asBitmap()
    .load(Uri.fromFile(new File(filePath)))
    .into(imageViewGifAsBitmap);

1
投票

我有第三种方法来设置图像/视频的缩略图。希望它会对你有所帮助。

1)ThumbnailUtils - >有效但很慢

Bitmap thumb = ThumbnailUtils.createVideoThumbnail(thumbPath, MediaStore.Video.Thumbnails.MINI_KIND);
        holder.ivThumb.setImageBitmap(thumb);

2)FFmpegMediaMetadataRetriever - >非常有效但很慢

FFmpegMediaMetadataRetriever retriever = new FFmpegMediaMetadataRetriever();
    try {
        retriever.setDataSource(thumbPath);
       thumb.setImageBitmap(retriever.getFrameAtTime(0));
    } catch (Exception ex) {
        // Assume this is a corrupt  file
    }

3)Glide - >有效和快速

   RequestOptions options = new RequestOptions()
            .centerCrop()
            .placeholder(android.R.drawable.stat_notify_error)
            .error(android.R.drawable.stat_notify_error);

    Glide.with(context)
            .load(thumPath)
            .apply(options)
            .into(thumb);

0
投票

您可以使用ThumbnailUtils以3种格式加载视频缩略图:

  • MINI_KIND:适合媒体详情视图
  • FULL_SCREEN_KIND:头球很好
  • qazxsw poi:适合RecyclerView
MICRO_KIND

最大的缺点是ThumbnailUtils在UI线程上运行,所以如果你尝试在recycleView中使用这个方法,那么它就会让你的应用程序跳过帧。您的RecycleView将具有滞后滚动,如果您有超过7个项目,那么您的应用程序将开始抛出ANR。

这意味着您需要创建AsyncTask或Threads,这可能再次导致内存泄漏。

结论; Glide更适合加载视频大拇指。

这里holder.videoThumb.setImageBitmap( ThumbnailUtils.createVideoThumbnail(getItem(position) .videoURL, MediaStore.Images.Thumbnails.MICRO_KIND)) 是重要的参数,对我有用,并在循环视图中提供平滑的快速滚动。

DiskCacheStrategy.RESULT

0
投票

在没有FileDescriptorBitmapDecoder的情况下,某些设备无法正常工作

所以我在FileDescriptorBitmapDecoder中使用了以下代码

            Glide.with(context).load(getItem(position).videoURL)
                    .asBitmap()
                    .placeholder(R.drawable.app_icon)
                    .centerCrop()
                    .diskCacheStrategy(DiskCacheStrategy.RESULT)
                    .into(holder.videoThumb)
© www.soinside.com 2019 - 2024. All rights reserved.