FlutterFFmpeg执行报错File:: Protocol not found的解决方法
问题:Flutter中使用FFmpeg转视频为音频时出现
File:: Protocol not found错误 这段Flutter代码用于初始化文件目录并通过FFmpeg将视频转成音频,但运行时出现以下错误:
File:: Protocol not found
Did you mean file:File:?
原代码如下:
Directory direc = (await getApplicationDocumentsDirectory()); Directory directory = Directory(direc.path+"/check"); print(directory.path); String command = "-i input_video.mp4 -vn -acodec copy output_audio.mp3"; print(HomePage.pickedvideo); File file = File(directory.path+"/out.mp3"); print(file); print(HomePage.pickedvideo); final FlutterFFmpeg FFmpeg = FlutterFFmpeg(); FFmpeg.execute("ffmpeg -i ${HomePage.pickedvideo}" " -map 0:a " "-acodec ${file}") .then((rc)=>{ print("FFmpeg process exited with rc $rc"); });
解决方案
错误根源
- FFmpeg命令参数逻辑错误:你错误地将
File对象直接拼接到-acodec参数后,-acodec需要的是音频编码格式(比如copy或libmp3lame),而非输出文件路径;输出文件路径需要单独作为命令的最后一个参数指定。 - 路径处理不规范:FFmpeg解析本地文件路径时,若路径含空格或格式不符合要求,会触发协议错误;同时原代码未确保目标目录存在,可能导致输出失败。
修复后的代码
Directory direc = await getApplicationDocumentsDirectory(); Directory directory = Directory('${direc.path}/check'); // 确保目标目录存在,递归创建父目录 await directory.create(recursive: true); print(directory.path); print(HomePage.pickedvideo); // 构造正确的输出文件路径 String outputPath = '${directory.path}/out.mp3'; print(outputPath); final FlutterFFmpeg ffmpeg = FlutterFFmpeg(); // 修正FFmpeg命令:输入路径 + 音频流选择 + 编码格式 + 输出路径 // 路径加双引号避免空格解析问题,若pickedvideo是本地路径且平台要求,可添加file://前缀 String command = '-i "${HomePage.pickedvideo}" -map 0:a -acodec copy "$outputPath"'; ffmpeg.execute(command).then((rc) { print("FFmpeg process exited with rc $rc"); });
关键修复点
- 提前创建目标目录:调用
create(recursive: true)确保输出目录存在,避免路径不存在的错误。 - 修正FFmpeg命令结构:将输出文件路径移至命令末尾,
-acodec参数指定正确的编码格式(copy表示直接复制原音频流,无需转码,效率更高)。 - 路径包裹双引号:避免路径中包含空格时FFmpeg解析失败。
- (可选)添加协议头:如果
HomePage.pickedvideo是本地文件路径且在iOS等平台报错,可尝试将输入路径改为'file://${HomePage.pickedvideo}'。
内容的提问来源于stack exchange,提问作者momin mobologics
相关产品推荐
相关产品推荐

