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
相关产品推荐
相关产品推荐

