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

解决MediaPlayer播放本地MP3时抛出错误(1,-2147483648)的问题

错误码(1,-2147483648)本质是MEDIA_ERROR_UNKNOWN,但结合你的场景,90%概率是Base64解码后的文件无效或者MediaPlayer初始化流程有问题,按以下步骤排查解决:

1. 先确认Base64解码的正确性

  • 检查你的mp3SoundByteArray是否由合法的MP3 Base64字符串解码而来:如果Base64带data:audio/mp3;base64,这类前缀,必须先截取后面的纯Base64部分再解码,否则写入的文件会包含无效头部,直接导致播放失败。
  • 把解码后的byteArray导出成MP3文件,用系统自带播放器或第三方音频工具打开,确认文件本身能正常播放——如果这一步都失败,问题出在Base64源数据或解码过程,和MediaPlayer无关。

2. 修正MediaPlayer的使用逻辑

你的代码里用FileDescriptor设置数据源容易出问题,直接用文件路径更稳定;同时要调整初始化顺序,并且确保流被正确关闭:

val file = File(requireContext().getExternalFilesDir(null), "audioRecording1.mp3")
val mediaPlayer = MediaPlayer()
try {
    // 写入文件:用BufferedOutputStream确保写入完成,避免数据截断
    BufferedOutputStream(FileOutputStream(file)).use { output ->
        output.write(mp3SoundByteArray)
    }

    // 先设置音频属性,再设置数据源(MediaPlayer的初始化顺序很重要)
    mediaPlayer.setAudioAttributes(
        AudioAttributes.Builder()
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .setUsage(AudioAttributes.USAGE_MEDIA)
            .build()
    )
    // 直接用文件路径设置数据源,比FileDescriptor更可靠
    mediaPlayer.setDataSource(file.absolutePath)

    mediaPlayer.prepareAsync()
    mediaPlayer.setOnPreparedListener {
        mediaPlayer.start()
    }
    mediaPlayer.setOnErrorListener { _, what, extra ->
        Log.e("MediaPlayerError", "Error code: $what, $extra")
        true
    }
} catch (e: Exception) {
    Log.e("AudioPlayError", e.message ?: "Unknown error")
    toast(e.message ?: "Unknown error")
} finally {
    // 页面销毁时释放MediaPlayer,避免内存泄漏
    lifecycle.addObserver(object : DefaultLifecycleObserver {
        override fun onDestroy(owner: LifecycleOwner) {
            mediaPlayer.release()
        }
    })
}

3. 额外排查点

  • 检查文件大小:如果写入后的MP3文件只有几KB甚至0KB,说明解码后的byteArray是空的,回去检查Base64字符串是否正确获取。
  • 确认音频格式:如果你的音频不是标准MP3编码(比如是AAC、WAV但后缀写成MP3),MediaPlayer可能无法识别,这种情况建议换用ExoPlayer,它支持更多音频格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 16:01:14