Android使用MediaRecorder API录制的3gp音频提示格式不支持无法播放
问题修复方案
核心原因
Android 11对MediaRecorder的参数校验和封装逻辑做了调整,当前配置存在两个核心问题:
- 未明确配置音频基础参数(采样率、比特率、声道数),部分Android 11设备会默认生成不符合标准封装规范的3gp文件
- AMR_NB编码的3gp格式本身兼容性极差,绝大多数桌面/移动端播放器默认不支持该编码格式
修复步骤
1. 调整MediaRecorder初始化配置
替换原有初始化逻辑,明确配置所有必要参数,同时更换为兼容性更好的AAC编码+MP4封装方案:
myAudioRecorder = new MediaRecorder(); myAudioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); myAudioRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); myAudioRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); // 明确配置音频参数,避免设备默认值不规范 myAudioRecorder.setAudioSamplingRate(44100); myAudioRecorder.setAudioEncodingBitRate(128000); myAudioRecorder.setAudioChannels(1); String fullPath = requireContext().getExternalFilesDir(Util.VOICE_NOTES_FOLDER_NAME).getAbsolutePath() + File.separator + System.currentTimeMillis()+".m4a"; myAudioRecorder.setOutputFile(fullPath);
2. 完善停止录制的异常捕获
录制时长过短(小于1秒)时直接调用stop()会抛出异常,导致音频文件的封装头未写入、文件损坏,修改stopRecording方法:
private void stopRecording(){ if (myAudioRecorder == null) { return; } try { myAudioRecorder.stop(); } catch (IllegalStateException e) { // 捕获停止异常,避免崩溃,可自行补充删除无效零时长文件的逻辑 e.printStackTrace(); } finally { myAudioRecorder.reset(); myAudioRecorder.release(); myAudioRecorder = null; } Toast.makeText(requireContext(), "recording finished", Toast.LENGTH_SHORT).show(); }
3. 可选3gp兼容方案
如果业务必须使用3gp格式,可将编码器更换为AMR_WB,同时明确配置对应采样率:
myAudioRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); myAudioRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB); myAudioRecorder.setAudioSamplingRate(16000); myAudioRecorder.setAudioEncodingBitRate(12200); myAudioRecorder.setAudioChannels(1);
修改后生成的3gp文件兼容性会明显提升。
内容的提问来源于stack exchange,提问作者Ziyaad Shiraz
相关产品推荐
相关产品推荐

