Android中使用MediaRecorder录制AAC格式音频失败,文件损坏如何解决?
解决MediaRecorder录制AAC音频损坏的问题
我之前也踩过这个一模一样的坑!录的时候文件大小一直在涨,结果停止录制后直接损坏无法播放,折腾了好久才找到问题所在。这种情况大多是参数配置不兼容或者录制流程不规范导致的,咱们一步步来排查解决:
1. 先把核心参数配置搞对
AAC音频需要合适的容器格式来封装,很多人踩坑就是输出格式和编码器不匹配:
- 优先用
OutputFormat.MPEG_4作为输出格式,搭配AudioEncoder.AAC编码器,这是兼容性最广的组合,MP4容器会自动处理AAC的头信息,避免文件损坏。 - 别用
OutputFormat.AAC_ADTS,虽然名字带AAC,但很多设备对这个格式的支持不好,而且ADTS需要手动处理帧头,MediaRecorder在某些设备上不会生成完整的头信息。
给你一个经过验证的配置示例:
MediaRecorder mediaRecorder = new MediaRecorder(); // 设置音频源为麦克风 mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 用MP4容器封装AAC mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); // 指定AAC编码器 mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); // 设置通用的采样率和码率,避免设备兼容问题 mediaRecorder.setAudioSamplingRate(44100); mediaRecorder.setAudioEncodingBitRate(128000); // 设置输出文件路径(建议用应用私有目录,避免权限问题) File outputFile = new File(getFilesDir(), "recording.mp4"); mediaRecorder.setOutputFile(outputFile.getAbsolutePath());
2. 严格遵守录制的生命周期流程
很多人直接调用stop()就完事了,但不正确的流程会导致文件写入不完整:
- 正确顺序必须是:
prepare()→start()→stop()→release()- 调用
start()之前一定要先调用prepare(),否则会抛出异常 - 停止录制时,必须先调用
stop(),再调用release()释放资源,确保所有数据都写入文件 - 不要在
stop()之前调用release(),也不要重复调用start()或stop()
- 调用
- 注意:如果录制时间过短(比如小于1秒),有些设备的MediaRecorder可能不会生成完整的文件头,导致无法播放,建议测试时录制至少2秒以上的音频。
3. 权限和文件路径的隐形坑
- 录音权限:Android 6.0及以上必须动态申请
RECORD_AUDIO权限,没有权限的话,MediaRecorder看似在录制,但实际没有写入任何音频数据 - 存储权限:如果把文件写到外部存储,Android 10及以上需要用
MediaStore或者申请MANAGE_EXTERNAL_STORAGE权限,最稳妥的方式是用应用私有目录(比如getFilesDir()),不需要额外的存储权限
4. 验证问题的小技巧
- 把录制好的文件导出到电脑,用
ffmpeg查看文件信息:
如果输出显示有AAC音频流,说明录制成功;如果提示“Invalid data found when processing input”,说明文件确实损坏,回到参数和流程排查。ffmpeg -i recording.mp4 - 先测试系统自带的录音机能不能录制AAC格式并正常播放,排除设备本身不支持AAC的极端情况。
按照上面的步骤调整后,应该就能正常录制可播放的AAC音频了!
内容的提问来源于stack exchange,提问作者Victor2748
相关产品推荐
相关产品推荐

