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

Android中FFmpeg执行成功却未生成指定输出文件的问题排查

解决FFmpeg转视频为音频后无输出文件的问题

我来帮你排查下这个问题,看了你的代码和命令,发现几个关键的可能原因,咱们一步步来解决:

1. 命令开头的-version参数是元凶

你的命令示例开头有-version,这个参数会让FFmpeg直接输出版本信息就退出,根本不会执行后面的转码逻辑!哪怕日志显示success,那也只是FFmpeg成功执行了“输出版本”这个命令,完全没处理转码。

解决方法:把命令开头的-version删掉。比如你的CMD_HEAD应该改成"-y -i ",而不是包含-version。

2. 输出目录可能不存在

FFmpeg无法自动创建不存在的文件夹,如果/storage/emulated/0/Memento/这个目录没创建,转码后的文件就无法写入。

解决方法:在生成输出文件路径前,先检查并创建目录:

String homeDir = FileManager.getHomeDir();
File outputDir = new File(homeDir);
if (!outputDir.exists()) {
    // 创建多级目录
    outputDir.mkdirs();
}
// 再生成输出文件路径
String out_audio_file = homeDir + File.separator + fileName.substring(0, fileName.length()-3) + "aac";

3. 用split(" ")拆分命令有隐患

如果你的视频文件名或路径里包含空格,split(" ")会把完整的路径拆成多个参数,导致FFmpeg无法识别正确的输入/输出路径。

解决方法:手动构建命令数组,避免字符串拼接后拆分:

// 直接构建参数数组,每个参数都是独立元素
String inputPath = videoItems.get(position).getTitle();
String outputPath = homeDir + File.separator + fileName.substring(0, fileName.length()-3) + "aac";
String[] command = {
    "-y",
    "-i", inputPath,
    "-f", "aac",
    "-ab", "192000",
    "-vn",
    outputPath
};
Converter.execFFmpegBinary(command);

4. 权限问题(Android 6.0+)

如果你的设备是Android 6.0及以上,需要动态申请读写外部存储权限;Android 10+还要注意分区存储的限制:

  • 确保已经申请了READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE权限
  • Android 10可以在AndroidManifest.xml里添加android:requestLegacyExternalStorage="true"来兼容旧的文件访问方式
  • Android 11+建议使用MediaStore来保存输出文件,或者适配分区存储规则

5. 查看FFmpeg的详细输出

当前你的日志只打印了“success”或“fail”,但FFmpeg的具体执行输出(比如错误信息)会传到onSuccess和onFailure的s参数里,建议打印这个参数来排查:

@Override
public void onFailure(String s) {
    Log.d("execFFmpegBinary", "执行失败详情: " + s);
}
@Override
public void onSuccess(String s) {
    Log.d("execFFmpegBinary", "执行成功输出: " + s);
}

先优先解决第一个问题(去掉-version),这是最可能导致无输出的原因,然后再依次排查其他点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:37:40