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

Flutter使用audiocutter包裁剪音频无法生成输出文件求助

音频裁剪功能实现修复方案

你的代码核心问题有两点:

  • FFmpegKit.executeAsync是异步执行方法,你没有等待命令执行完成就直接返回了输出路径,此时FFmpeg裁剪任务还在运行,自然找不到生成的文件。
  • 缺少执行错误日志捕获,无法定位是命令参数错误、权限问题还是编码库缺失导致的执行失败。

修复后可用代码

import 'package:path_provider/path_provider.dart';
import 'package:ffmpeg_kit_flutter/ffmpeg_kit.dart';
import 'package:ffmpeg_kit_flutter/return_code.dart';
import 'package:flutter/foundation.dart';

static Future<String?> cutAudio(String path, double start, double end) async {
    final Directory dir = await getTemporaryDirectory();
    // 输出路径加时间戳避免重复覆盖
    final outPath = "${dir.path}/output_${DateTime.now().millisecondsSinceEpoch}.mp3";
    var cmd = "-y -i \"$path\" -vn -ss $start -to $end -ar 16000 -ac 2 -b:a 96k -c:a libmp3lame $outPath";
    debugPrint("FFmpeg执行命令:$cmd");

    // 等待FFmpeg命令执行完成再返回结果
    final session = await FFmpegKit.execute(cmd);
    final returnCode = await session.getReturnCode();
    
    if (ReturnCode.isSuccess(returnCode)) {
      debugPrint("音频裁剪成功,输出路径:$outPath");
      return outPath;
    } else {
      // 打印错误日志方便排查问题
      final errorLog = await session.getOutput();
      debugPrint("裁剪失败,错误码:$returnCode,错误详情:$errorLog");
      return null;
    }
}

其他异常排查点

  • 确认输入文件路径有效,有读取权限:Android高版本需要申请存储权限,iOS需要确认文件在沙盒可访问范围内。
  • 确认你引入的ffmpeg_kit_flutter包含libmp3lame编码库,min版本的FFmpeg包不包含MP3编码能力,需要改用含MP3编码的版本。
  • 确认传入的start、end参数单位为秒,数值逻辑合法(end必须大于start,且不超过音频总时长)。
  • 如果你需要将文件保存到公共存储目录,需要单独申请对应平台的存储写入权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:36:02