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

