README.md

    音频录制、播放

    最近在项目要用到录音的功能,研究了几天,看了很多的资料,今天在这里分享记录一下以便回头查看。Android给我们提供了两个录音的API接口:MediaRecord、AudioRecoder

    MediaRecord:

    1. 优点:

    • 可以录制音频、视频
    • 提供了录制、压缩、编码等功能
    • 使用简单方便,几行代码就可实现

    2. 缺点:

    • 可以录制的视频格式较少
    • 录制的过程中不能暂停
    • 不能实时处理音频数据(实时对讲的话用它就不适合了)

    3. 注意:

    • 模拟器不支持音频、视频录制,只能在真机上测试
    • 录制一定打开录制权限 <uses-permission android:name="android.permission.RECORD_AUDIO" />
    • Android 9(API级别28)或更高,应用程序在后台运行不能访问麦克风

    4.使用:

    初始化
     public SuperMediaManager(Context context) {
            mMediaRecorder = new MediaRecorder();
            //设置音频的来源
            mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            //设置音频的输出格式
            mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);//设置输出文件的格式
            //设置音频文件的编码
            mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);//设置音频文件的编码
    
            mMediaPlayer = new MediaPlayer();
        }
    开始录制
    public void startRecord(String filepath) {
            Log.v(TAG, "startRecord startRecord");
            Log.v(TAG, "file path:" + filepath);
            //如果正在录制,就返回了
            if(isRecording){
                return;
            }
            mMediaRecorder.setOutputFile(filepath);
            try {
                //录制前准备工作
                mMediaRecorder.prepare();
                //开始录制
                mMediaRecorder.start();
    
                isRecording = true;
                Log.v(TAG, "startRecord record succ...");
            } catch (Exception e) {
                Log.v(TAG, "startRecord record fail:" + e.toString());
            }
    }
    停止录制
    public void stopRecord() {
            if (mMediaRecorder != null && isRecording) {
                //停止录制
                mMediaRecorder.stop();
                //重新开始
                mMediaRecorder.reset();//注意:可以通过返回setAudioSource()步骤来重用该对象
                //mMediaRecorder.release();注意:这个对象不能再次被使用,如果此次再次录制,就会报错
                isRecording = false;
            }
        }
    录制监听
    • 录制错误监听:MediaRecorder.OnErrorListener
    onError(MediaRecorder mr, int what, int extra)

    MEDIA_RECORDER_ERROR_UNKNOWN:未知错误 MEDIA_ERROR_SERVER_DIED:媒体服务卡死,在这种情况下,应用程序必须释放MediaRecorder对象并实例化一个新对象

    • 录制警告信息监听:MediaRecorder.OnInfoListener
    onInfo(MediaRecorder mr, int what, int extra)	

    MediaRecorder.MEDIA_RECORDER_INFO_UNKNOWN:未知的错误
    MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED:录制超时了 MediaRecorder.MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED:录制文件超过指定大小了,需要setNextOutputFile(File)指定一个新的文件进行存储

    播放
    public void play(String filepath) {
            try {
                //如果正在播放,然后在播放其他文件就直接崩溃了
                if(mMediaPlayer.isPlaying()){
                    return;
                }
                //设置数据源
                mMediaPlayer.setDataSource(filepath);
                //这个准备工作必须要做
                mMediaPlayer.prepare();
                mMediaPlayer.start();
                mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                    @Override
                    public void onCompletion(MediaPlayer mp) {
                        //播放完毕再重置一下状态,下次播放可以再次使用
                        mp.reset();
                    }
                });
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    录制状态图:

    AudioRecoder:

    优点:

    • 专业的音频录制API,支持实时录制、支持暂停等,以流的形式进行录制和播放的操作

    缺点:

    • 录制格式为pcm,在播放器不能直接播放,需要编码和压缩

    使用

    初始化
     public SuperMediaManager(Context context) {
            mMediaRecorder = new MediaRecorder();
            //设置音频的来源
            mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            //设置音频的输出格式
            mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);//设置输出文件的格式
            //设置音频文件的编码
            mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);//设置音频文件的编码
    
            mMediaPlayer = new MediaPlayer();
        }
    开始录制
     public void startRecord(String filepath) {
            Log.v(TAG, "startRecord startRecord");
            Log.v(TAG, "file path:" + filepath);
            //如果正在录制,就返回了
            if(isRecording){
                return;
            }
            mMediaRecorder.setOutputFile(filepath);
            try {
                //录制前准备工作
                mMediaRecorder.prepare();
                //开始录制
                mMediaRecorder.start();
    
                isRecording = true;
                Log.v(TAG, "startRecord record succ...");
            } catch (Exception e) {
                Log.v(TAG, "startRecord record fail:" + e.toString());
            }
        }
    停止录制
    public void stopRecord() {
            if (mMediaRecorder != null && isRecording) {
                //停止录制
                mMediaRecorder.stop();
                //重新开始
                mMediaRecorder.reset();//注意:可以通过返回setAudioSource()步骤来重用该对象
                //mMediaRecorder.release();注意:这个对象不能再次被使用,如果此次再次录制,就会报错
                isRecording = false;
            }
        }
    播放
    public void play(String filepath) {
            try {
                //如果正在播放,然后在播放其他文件就直接崩溃了
                if(mMediaPlayer.isPlaying()){
                    return;
                }
                //设置数据源
                mMediaPlayer.setDataSource(filepath);
                //这个准备工作必须要做
                mMediaPlayer.prepare();
                mMediaPlayer.start();
                mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                    @Override
                    public void onCompletion(MediaPlayer mp) {
                        //播放完毕再重置一下状态,下次播放可以再次使用
                        mp.reset();
                    }
                });
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    问题反馈

    在使用中有任何问题,欢迎反馈给我,可以用以下联系方式跟我交流

    关于作者

      var geduo_83 = {
        nickName  : "geduo_83",
        site : "http://www.weibo.com/geduo83"
      }

    项目简介

    Android 音频录制、播放,最近在项目要用到录音的功能,研究了几天,看了很多的资料,今天在这里分享记录一下以便回头查看。Android给我们提供了两个录音的API接口:MediaRecord、AudioRecoder

    发行版本

    当前项目没有发行版本

    贡献者 1

    门心叼龙 @geduo_83

    开发语言

    • Java 100.0 %