Flutter 中如何将 GIF 格式文件转换为 MP4 视频?
Flutter 实现GIF转MP4的具体实现方案
依赖选型
目前主流方案使用ffmpeg_kit_flutter完成音视频处理,该库是FFmpeg官方维护的Flutter封装版本,兼容Android、iOS、桌面端等多平台,替代已停止维护的flutter_ffmpeg包。
1. 环境配置与依赖引入
1.1 新增依赖
在pubspec.yaml中添加依赖:
dependencies: ffmpeg_kit_flutter: ^6.0.3 path_provider: ^2.1.0 # 用于获取应用可读写目录 permission_handler: ^11.0.1 # 按需添加,用于处理存储读写权限
1.2 平台适配
- Android:修改
android/app/build.gradle中的minSdkVersion为24(使用full特性包的要求,min包可低至16) - iOS:修改
ios/Podfile中的全局平台版本为platform :ios, '12.1',执行pod install完成依赖安装
2. 核心转换逻辑
2.1 FFmpeg 转换命令说明
GIF转MP4的通用兼容命令如下:
-i <输入GIF路径> -movflags faststart -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" <输出MP4路径>
各参数作用:
-movflags faststart:将元数据移到文件头部,支持流式播放pix_fmt yuv420p:统一像素格式,兼容绝大多数端侧播放器scale=trunc(iw/2)*2:trunc(ih/2)*2:自动将视频宽高调整为偶数,避免H264编码报错
2.2 代码实现示例
import 'dart:io'; import 'package:ffmpeg_kit_flutter/ffmpeg_kit.dart'; import 'package:ffmpeg_kit_flutter/return_code.dart'; import 'package:path_provider/path_provider.dart'; Future<String?> convertGifToMp4(String inputGifPath) async { // 1. 校验输入文件有效性 final inputFile = File(inputGifPath); if (!await inputFile.exists()) { return null; } // 2. 生成输出文件路径 final tempDir = await getTemporaryDirectory(); final outputMp4Path = '${tempDir.path}/${DateTime.now().millisecondsSinceEpoch}.mp4'; // 3. 构造执行命令 final command = '-i $inputGifPath -movflags faststart -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" $outputMp4Path'; // 4. 执行转换 final session = await FFmpegKit.execute(command); final returnCode = await session.getReturnCode(); if (ReturnCode.isSuccess(returnCode)) { // 转换成功,返回输出文件路径 return outputMp4Path; } else { // 转换失败,打印错误日志排查 final errorLog = await session.getAllLogsAsString(); print('转换失败: $errorLog'); return null; } }
3. 常见问题处理
- 权限问题:如果需要读取外部存储的GIF文件,或者将输出MP4保存到系统相册,需要提前申请对应存储读写权限
- 大文件转换慢:可添加
-crf 28参数调整压缩率,平衡画质和转换速度,数值越高压缩率越高、画质越低 - 输出视频时长和GIF不一致:可添加
-r <帧率>参数强制指定输出帧率,比如GIF帧率为15的话加-r 15即可
内容的提问来源于stack exchange,提问作者Ryan Wang
相关产品推荐
相关产品推荐

