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

使用Flutter FFMPEG_KIT将RGBA图像序列转为MP4视频遇问题求助

问题:Flutter中使用FFMPEGKit将RGBA图像序列转为MP4视频报错

我正尝试用Flutter的FFMPEGKit包把RGBA字节图像序列转换成MP4视频,以下是我的代码片段,但运行报错,不确定把rawrgba图像集转为视频该用哪些正确参数,求帮助。

视频编码代码片段

static Future<void> videoEncoder() async {
    appTempDir = '${(await getTemporaryDirectory()).path}/workPath';
   
    FFmpegKit.execute(
           '-hide_banner -y -f rawvideo -pix_fmt rgba -i appTempDir/input%d.rgba -c:v mpeg4  -r 12 appTempDir/output.mp4')
     .then((session) async {
       final returnCode = await session.getReturnCode();
      if (ReturnCode.isSuccess(returnCode)) {
        print('SUCCESS');
      } else if (ReturnCode.isCancel(returnCode)) {
        print('CANCEL');
      } else {
        print('ERROR');
      }
    });
  }
}

RGBA图像保存代码片段

Utils.getBuffer(renderKey).then((value) async {
        ui.Image buffer = value;
        final data =
            await buffer!.toByteData(format: ui.ImageByteFormat.rawRgba);
        Uint8List uData = data!.buffer.asUint8List();
        VideoUtil.saveImageFileToDirectory(uData, 'input$frameNum.rgba');
        frameNum++;
        });

问题分析与修正

你的代码存在几个关键问题,同时FFmpeg参数需要补充必要配置:

  1. Dart变量未插入命令字符串:命令中直接写appTempDir不会被解析为实际路径,需用字符串插值替换
  2. 缺失图像分辨率参数:rawvideo是无格式头的字节流,FFmpeg无法自动识别宽高,必须通过-s指定
  3. 帧率参数位置错误:-r放在输入后仅控制输出帧率,若要匹配图像序列的输入帧率,需放在输入参数前
  4. 编码器与像素格式优化:默认mpeg4编码器兼容性不如h.264,且需转换为MP4标准支持的像素格式

修正后的代码

static Future<void> videoEncoder() async {
  appTempDir = '${(await getTemporaryDirectory()).path}/workPath';
  // 替换为你的图像实际宽高
  final imageWidth = 1920;
  final imageHeight = 1080;
  final frameRate = 12;

  final command = '-hide_banner -y '
      '-r $frameRate ' // 输入帧率,匹配图像序列生成速度
      '-f rawvideo '
      '-pixel_format rgba '
      '-s ${imageWidth}x${imageHeight} ' // 强制指定图像分辨率,必填
      '-i $appTempDir/input%d.rgba '
      '-c:v libx264 ' // 使用h.264编码器,兼容性更强
      '-pix_fmt yuv420p ' // 转换为MP4标准支持的YUV420P格式
      '-r $frameRate ' // 输出帧率
      '$appTempDir/output.mp4';

  FFmpegKit.execute(command).then((session) async {
    final returnCode = await session.getReturnCode();
    if (ReturnCode.isSuccess(returnCode)) {
      print('SUCCESS');
    } else if (ReturnCode.isCancel(returnCode)) {
      print('CANCEL');
    } else {
      // 打印错误日志便于排查
      final logs = await session.getAllLogs();
      print('ERROR: ${logs.map((log) => log.getMessage()).join('\n')}');
    }
  });
}

关键参数说明

  • -s ${imageWidth}x${imageHeight}:必填项,FFmpeg无法自动识别rawrgba的图像尺寸,不指定会直接解码失败
  • -pix_fmt yuv420p:MP4视频的标准像素格式,确保生成的视频能在绝大多数播放器正常播放
  • -r $frameRate:前后各加一次,分别控制输入序列的读取速度和输出视频的帧率,保持一致即可
  • libx264编码器:需确保你依赖的FFMPEGKit包包含该编码器(建议使用ffmpeg_kit_flutter_full)

另外需注意:input%d.rgba的命名必须是连续数字(如input1.rgba、input2.rgba...),若出现断号会导致FFmpeg无法识别序列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 03:15:21