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