thumbnail_util.dart 1.93 KB
import 'dart:io';

import 'package:ffmpeg_kit_flutter_new/ffmpeg_kit.dart';
import 'package:ffmpeg_kit_flutter_new/return_code.dart';
import 'package:flutter_image_compress/flutter_image_compress.dart';

/// 缩略图工具类
///
class ThumbnailUtil {
  ///  在指定目录下生成缩略图
  ///  返回缩略图路径
  static Future<String?> genTempThumbnail(File imageFile, Directory dir) async {
    try {
      // 缩略图路径
      final tempPath = dir.path;
      final targetPath = '$tempPath/thumbnail_${DateTime.now().millisecondsSinceEpoch}.jpg';

      // 压缩生成缩略图文件
      final compressedFile = await FlutterImageCompress.compressAndGetFile(imageFile.absolute.path, targetPath);

      return compressedFile!.path;
    } catch (e) {
      print('生成缩略图出错: $e');
      return null;
    }
  }

  /// 为视频文件生成缩略图
  /// 返回缩略图路径
  static Future<String?> genVideoThumbnail(String videoPath, Directory dir) async {
    try {
      final thumbnailPath = '${dir.path}/video_thumb_${DateTime.now().millisecondsSinceEpoch}.jpg';

      // 使用 ffmpeg_kit_flutter_new 生成视频缩略图
      // 构建FFmpeg命令行参数
      String cmd = '-i "$videoPath" ' // 指定输入文件路径
          '-ss 1 ' // 从视频第1秒处截取画面
          '-vframes 1 ' // 只截取一帧画面
          '-vf scale=128:-1 ' // 设置缩略图宽度为128像素,高度按比例缩放
          '-y ' // 覆盖已存在的输出文件
          '"$thumbnailPath"'; // 指定输出文件路径

      final session = await FFmpegKit.execute(cmd);
      final returnCode = await session.getReturnCode();

      if (ReturnCode.isSuccess(returnCode)) {
        return thumbnailPath;
      } else {
        print('生成视频缩略图失败: ${await session.getFailStackTrace()}');
        return null;
      }
    } catch (e) {
      print('生成视频缩略图出错: $e');
      return null;
    }
  }
}