在Flutter中实现视频压缩,可以通过以下方法:
推荐方案:使用 video_compress 包
1. 添加依赖
dependencies:
video_compress: ^4.1.0
2. 基本使用代码
import 'package:video_compress/video_compress.dart';
class VideoCompressor {
// 压缩视频
static Future<MediaInfo?> compressVideo(String videoPath) async {
try {
// 设置压缩参数
final MediaInfo mediaInfo = await VideoCompress.compressVideo(
videoPath,
quality: VideoQuality.MediumQuality, // 质量等级
deleteOrigin: false, // 是否删除原文件
);
return mediaInfo;
} catch (e) {
print('压缩失败: $e');
return null;
}
}
// 获取视频信息
static Future<MediaInfo?> getVideoInfo(String videoPath) async {
return await VideoCompress.getMediaInfo(videoPath);
}
// 取消压缩
static void cancelCompression() {
VideoCompress.cancelCompression();
}
}
3. 使用示例
// 选择并压缩视频
void compressSelectedVideo() async {
// 选择视频文件(需要配合其他包如 image_picker)
// final file = await ImagePicker().pickVideo(source: ImageSource.gallery);
String videoPath = 'your_video_path.mp4';
// 获取原视频信息
MediaInfo? originalInfo = await VideoCompressor.getVideoInfo(videoPath);
print('原视频大小: ${originalInfo?.filesize}');
// 压缩视频
MediaInfo? compressedInfo = await VideoCompressor.compressVideo(videoPath);
if (compressedInfo != null) {
print('压缩后大小: ${compressedInfo.filesize}');
print('压缩后路径: ${compressedInfo.file?.path}');
// 计算压缩率
double compressionRatio = (compressedInfo.filesize! / originalInfo!.filesize!) * 100;
print('压缩率: ${compressionRatio.toStringAsFixed(2)}%');
}
}
4. 压缩质量选项
VideoQuality.LowQuality // 低质量
VideoQuality.MediumQuality // 中等质量(推荐)
VideoQuality.HighQuality // 高质量
VideoQuality.DefaultQuality // 默认质量
VideoQuality.Res1280x720Quality // 720p
VideoQuality.Res640x480Quality // 480p
5. Android 配置
在 android/app/src/main/AndroidManifest.xml 中添加权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
6. iOS 配置
在 ios/Runner/Info.plist 中添加:
<key>NSPhotoLibraryUsageDescription</key>
<string>需要访问相册来选择视频</string>
其他可选方案
- 使用 FFmpeg:通过
flutter_ffmpeg 包,提供更精细的控制
- 自定义压缩:结合平台原生代码实现
注意事项
- 压缩大文件可能需要较长时间
- 建议在后台线程执行压缩操作
- 及时释放资源,避免内存泄漏
- 测试不同质量设置以平衡文件大小和画质
这种方法简单有效,适合大多数视频压缩需求。