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

