You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何通过视频路径生成缩略图?

如何为本地视频文件生成缩略图用于Tile展示

一、Android原生API方案

1. MediaMetadataRetriever(灵活获取指定帧)

这是最通用的原生方案,支持提取视频任意时间点的帧作为缩略图,代码示例:

public Bitmap getVideoThumbnail(String videoPath) {
    MediaMetadataRetriever retriever = new MediaMetadataRetriever();
    Bitmap thumbnail = null;
    try {
        retriever.setDataSource(videoPath);
        // 获取视频第1秒处的帧(单位:微秒),OPTION_CLOSEST_SYNC确保取到关键帧,效率更高
        thumbnail = retriever.getFrameAtTime(1_000_000, MediaMetadataRetriever.OPTION_CLOSEST_SYNC);
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } finally {
        try {
            retriever.release();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return thumbnail;
}

你可以根据需求调整时间参数,或者用OPTION_CLOSEST取最接近指定时间的帧(不一定是关键帧)。

2. ThumbnailUtils(快速生成标准尺寸缩略图)

如果只需要系统定义的标准尺寸缩略图,这个封装好的工具类更省心:

public Bitmap getVideoThumbnail(String videoPath) {
    // MINI_KIND对应约512x384的缩略图,MICRO_KIND是96x96,FULL_SCREEN_KIND为全屏尺寸
    return ThumbnailUtils.createVideoThumbnail(videoPath, MediaStore.Images.Thumbnails.MINI_KIND);
}

该方法内部基于MediaMetadataRetriever实现,省去了手动释放资源的步骤。

二、第三方库简化实现(推荐列表场景)

如果是在RecyclerView这类列表中批量加载缩略图,用Glide可以自动处理后台加载、缓存和内存优化,无需手动管理线程:

Glide.with(context)
    .asBitmap()
    .load(Uri.fromFile(new File(videoPath)))
    .override(200, 150) // 指定Tile需要的缩略图尺寸,避免内存浪费
    .into(new CustomTarget<Bitmap>() {
        @Override
        public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
            // 将Bitmap设置到Tile的leading视图
            tileLeadingImageView.setImageBitmap(resource);
        }

        @Override
        public void onLoadCleared(@Nullable Drawable placeholder) {
            // 加载完成或视图回收时清理资源
        }
    });

关键注意事项

  • 权限:Android 10及以下需要申请READ_EXTERNAL_STORAGE权限;Android 10+采用Scoped Storage,需适配媒体访问规则。
  • 线程安全:原生API的方法不能在主线程调用,否则会阻塞UI,建议用Coroutine、AsyncTask或者线程池处理。
  • 内存优化:生成的Bitmap要根据Tile的实际尺寸压缩,比如用Bitmap.createScaledBitmap()调整大小,避免OOM。

内容的提问来源于stack exchange,提问作者fayzo bngsh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 16:31:02