如何解决跨AAC格式的设备上的MediaRecorder和MediaPlayer兼容性问题
我们使用Android的本机MediaRecorder和MediaPlayer录制和播放语音消息,但一些用户报告说他们无法播放语音消息。例如,三星上记录的消息无法在OnePlus或诺基亚上播放。
因此,我们尝试将编解码器从AAC更改为HE_AAC,这解决了一些用户的问题,但是某些电话型号之间仍然存在兼容性问题。
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.HE_AAC)
昨天,我们尝试用exoPlayer替换MediaPlayer类。现在可以播放某些无法在某些手机上播放的音频文件,但并非所有音频文件都可以播放...
有什么建议吗?
我们的代码很常见。它在大多数情况下都有效。我们测试了从不同手机记录的所有文件,包括有问题的文件。它们都可以在Windows浏览器上播放。
MediaRecorder:
mediaRecorder = new MediaRecorder();
file = new File(context.getCacheDir(),Long.toString(System.currentTimeMillis()) + ".aac");
recorderPath = file.getAbsolutePath();
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.HE_AAC);
mediaRecorder.setOutputFile(recorderPath);
try {
mediaRecorder.prepare();
mediaRecorder.start();
} catch (IOException e) {
e.printStackTrace();
}
MediaPlayer:
private void play() {
if (mediaPlayer == null) {
mediaPlayer = MediaPlayer.create(context,Uri.parse(path));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
mediaPlayer.setAudioAttributes(new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setLegacyStreamType(AudioManager.STREAM_MUSIC)
.build());
} else {
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
}
mediaPlayer.setOnPreparedListener(this::onPrepared);
mediaPlayer.setOnCompletionListener(this::onCompletion);
}
}
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
@Override
public void onCompletion(MediaPlayer mp) {
mediaPlayer.reset();
mediaPlayer.release();
mediaPlayer=null;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。