Android开发 音频的录制(MediaRecorder)与播放(MediaPlayer)踩坑记录
来源:互联网 发布:windows live mail pst 编辑:程序博客网 时间:2024/05/29 12:30
在开发类似微信语音的产品功能时,语音的录制与播放分别用的是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; }
对于部分网友说的获取到的数值一直很小,比如只有0和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);
之后再试,一切正常。
3 0
- Android开发 音频的录制(MediaRecorder)与播放(MediaPlayer)踩坑记录
- Android播放器MediaPlayer与MediaRecorder:录制音频并播放
- android之音频的播放和录制(MediaPlayer,SoundPool,MediaRecorder)
- Android开发之录音MediaRecorder、播放音频(MediaPlayer、SoundPool)
- 使用MediaRecorder录制音频,用MediaPlayer播放音频
- Android音频开发之MediaRecorder/MediaPlayer
- Android移动开发-使用MediaRecorder录制音频的实现
- Android音频开发之使用MediaRecorder录制
- Android MediaRecorder录制音频
- Android MediaRecorder录制音频
- android MediaRecorder录制音频
- Android MediaRecorder与AudioRecord音频录制
- Android Multimedia实战(六)音频 MediaRecorder和AudioRecord录音与MediaPlayer和AudioTrack播放
- Android的音频录制与播放
- Android音频的播放与录制
- Android音频录制与播放
- Android开发笔记-音频录制/播放&音频
- Android开发笔记-音频录制/播放&音频
- Ubuntu12.04 root 用户登录设置
- Hadoop学习笔记 压缩
- 解决问题:onreadystatechange只触发一次
- 安卓 组件Service知识理解
- C4.5决策树代码详细解析以及C4.5程序调用(正确的代码!!!)
- Android开发 音频的录制(MediaRecorder)与播放(MediaPlayer)踩坑记录
- iOS 初始化报错 cannot assign to self outside of a method in the init
- Codeforces Round #225 (Div. 2)-C. Milking cows
- 利用scp 远程上传下载文件/文件夹
- spring加载bean
- 基础总结-Java基础(1)
- LeetCode 118. Pascal's Triangle
- Java 易错知识点
- myeclipse building workspace如何禁止及提高myeclipse速度