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

Flutter中FFmpegKit转换视频返回退出码1,flutter_ffmpeg可正常工作

问题分析与修复方案

核心问题:返回码判断逻辑完全颠倒

FFmpegKit的返回码规则和你之前用的flutter_ffmpeg一致,但你代码里的判断搞反了:

  • 返回码0 = 执行成功
  • 返回码1 = 通用错误

你现在的代码是返回码为1时提示"保存成功",这完全错误,也是触发"转换失败"提示的直接原因——实际成功时返回码是0,走到了else分支。

修正后的代码

Directory tempDir = await getTemporaryDirectory();
String timestamp = DateTime.now().millisecondsSinceEpoch.toString();
String outputPath = "${tempDir.path}/$timestamp.mp4";

String command =
    '-i $_videoPath -vf "scale=$vidWidth:$vidHeight" -c:v libx264 -crf 23 $outputPath';

await FFmpegKit.executeAsync(command, (session) async {
  final returnCode = await session.getReturnCode();
  print('FFmpeg返回码: $returnCode');
  
  // 正确判断成功/失败
  if (ReturnCode.isSuccess(returnCode)) {
    ScaffoldMessenger.of(context)
        .showSnackBar(SnackBar(content: Text('Video Saved')));
    await GallerySaver.saveVideo(outputPath);
  } else {
    // 获取详细错误日志排查深层问题
    final logs = await session.getAllLogs();
    logs.forEach((log) => print('FFmpeg日志: ${log.getMessage()}'));
    ScaffoldMessenger.of(context)
        .showSnackBar(SnackBar(content: Text('Conversion Failed')));
  }
});

额外排查点(如果修正后仍有问题)

  • 依赖包完整性:FFmpegKit分多个预编译包,确保你在pubspec.yaml中引入的是包含libx264编码的版本,比如ffmpeg_kit_flutter_full(而非min版),因为libx264不是所有默认包自带的。
  • 变量合法性检查:确认_videoPath是有效文件路径,vidWidth和vidHeight是正整数(不能为0或负数,否则scale滤镜会报错)。
  • 权限问题:确保应用有读取原视频文件、写入临时目录的权限,Android上要处理READ_MEDIA_VIDEO/WRITE_EXTERNAL_STORAGE,iOS上要配置相册访问权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 02:42:22