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

Android Java实现MP4转MP3遇错求助

Android 将MP4转换为MP3的解决方案

可行性说明

可以实现MP4转MP3,推荐先将MP4下载到本地再转换(直接转换网络链接易受网络波动影响,成功率低)。以下针对你遇到的两个方案问题逐一修复:


方案一:修复mobile-ffmpeg报错(returnCode=1)

你的代码存在两个致命问题:

  1. 刚启动异步任务就调用FFmpeg.cancel(executionIdd)直接取消了转换,导致任务失败
  2. 输出路径未适配Android 10+的Scoped Storage规则,直接写入外部存储根目录可能无权限

修复步骤:

  1. 移除取消任务的代码:删除FFmpeg.cancel(executionIdd);这一行
  2. 适配存储路径:改用应用私有目录(无需额外权限)或通过MediaStore写入公共存储
  3. 确保依赖正确:引入正确的mobile-ffmpeg库版本(例如min-lts版,体积小且满足转码需求)
  4. 验证输入路径:如果是本地文件,确保文件存在且路径正确;如果用网络链接,需添加INTERNET权限,且链接需带完整协议(如https://)

修正后的代码示例:

private class Mp4ToMp3ConverterTask extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... params) {
        String mp4Source = params[0]; // 可以是本地文件路径或网络链接
        // 使用应用私有目录存储输出文件,无需额外权限
        File outputDir = getApplicationContext().getFilesDir();
        String mp3OutputPath = new File(outputDir, "output.mp3").getAbsolutePath();

        // FFmpeg转码命令:移除视频流,设置音频参数
        String[] ffmpegCommand = {"-i", mp4Source, "-vn", "-ar", "44100", "-ac", "2", "-b:a", "192k", mp3OutputPath};

        Config.enableStatisticsCallback(new StatisticsCallback() {
            public void apply(Statistics newStatistics) {
                Log.d("Dekh", String.format("frame: %d, time: %d", newStatistics.getVideoFrameNumber(), newStatistics.getTime()));
            }
        });

        FFmpeg.executeAsync(ffmpegCommand, new ExecuteCallback() {
            @Override
            public void apply(final long executionId, final int returnCode) {
                if (returnCode == RETURN_CODE_SUCCESS) {
                    Log.i("Dekh", "转码完成:" + mp3OutputPath);
                } else if (returnCode == RETURN_CODE_CANCEL) {
                    Log.i("Dekh", "转码被取消");
                } else {
                    Log.e("Dekh", "转码失败,错误码:" + returnCode);
                    // 可通过Config.getLastCommandOutput()获取详细错误日志
                    Log.e("Dekh", "错误详情:" + Config.getLastCommandOutput());
                }
            }
        });

        return mp3OutputPath;
    }
}

额外配置:

  • 依赖添加(build.gradle):
implementation 'com.arthenica:mobile-ffmpeg-min-lts:4.4.LTS'
  • 权限声明(AndroidManifest.xml):
<uses-permission android:name="android.permission.INTERNET" />
<!-- Android 9及以下需要读写权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" />

方案二:修复提取器初始化失败与路径错误

错误原因:

  1. Failed to instantiate extractor:输入的MP4文件损坏、路径无效,或文件未完全下载完成
  2. EISDIR (Is a directory):输出路径指向目录而非具体文件,或父目录未创建

修复步骤:

  1. 验证输入文件:确保MP4文件已完整下载,路径为具体文件路径(而非目录),且文件格式有效
  2. 修正输出路径:指定具体的MP3文件名,且提前创建父目录(如果需要)
  3. 适配Scoped Storage:Android 10+避免直接操作外部存储根目录,改用MediaStore或应用私有目录

完整流程建议

  1. 下载MP4到本地:用DownloadManager或OkHttp等工具将网络MP4文件下载到应用私有目录或公共存储
  2. 执行转码:使用修复后的mobile-ffmpeg方案进行转码
  3. 访问MP3文件:若需分享,可通过MediaStore将文件暴露到公共存储

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 00:53:28