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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 12:21:00