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

