在开发类似微信语音的产品功能时,语音的录制与播放分别用的是MediaRecorder和MediaPlayer,也都遇到了不少坑,特将其中的一些坑点记录一下:
1:在与ios端对接的时候,发现ios发的语音消息安卓可以播放,但是安卓发给ios的语音播放不了,经过调试发现是音频编码的问题;
修改位置如下:
将
// 设置MediaRecorder的音频源为麦克风
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
// 设置音频格式为RAW_AMR
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
// 设置音频编码为AMR_NB
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
修改为
// 设置MediaRecorder的音频源为麦克风
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
// 设置音频格式为AAC_ADTS
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AAC_ADTS);
// 设置音频编码为AAC
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
2:录音音量的显示
为了实现类似微信录音时动态显示音量的效果,做了以下处理:
public int getVoiceLevel(int maxlevel) {
if (isPrepare) {
try {
// getMaxAmplitude返回的数值最大是32767
Log.e("maxlevel",mMediaRecorder.getMaxAmplitude()+"");
return maxlevel * mMediaRecorder.getMaxAmplitude() / 32768 + 1;//返回结果1-7之间
} catch (Exception e) {
e.printStackTrace();
}
}
return 1;
}
The MediaRecorder.getMaxAmplitude() function returns unsigned 16-bit integer values (0-32767)
这是资料给出的音量解释,但是部分网友提到,在有些真机上 mMediaRecorder.getMaxAmplitude() 这个方法返回的值 的 范围并不是 0-32767,对此临时的解决方案是调整除数32768的大小,而如此修改并未考虑兼容性问题,因此正式情况如何处理需再做讨论,此处不提;
3:QCMediaPlayer mediaplayer NOT present 的问题
关于这个问题,网上资料给出的提示是修改创建MediaPlayer的方法;
将
mMediaPlayer = new MediaPlayer();
改为
mMediaPlayer = MediaPlayer.create(this, Uri.fromFile(new File(filePath)));
即可解决。但是我的情况是作此修改也未解决。。。。。。
后来只好默默地研究debug调试信息,发现除此报错之外还有一处提示,即是上面获取音量方法catch语句返回了空指针,遂在catch语句中也返回了一个音量值;再接着调试,又报错:“MediaPlayer error (1, -2147483648)”
搜索网络资料发现是编码问题,又将
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AAC_ADTS);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);