Android开发 音频的录制(MediaRecorder)与播放(MediaPlayer)踩坑记录

    在开发类似微信语音的产品功能时,语音的录制与播放分别用的是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);

之后再试,一切正常。
发布了32 篇原创文章 · 获赞 36 · 访问量 17万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览