Android音频录制、播放,这一篇就够了

版权声明:本文出自门心叼龙的博客,转载请注明出处。 https://blog.csdn.net/geduo_83/article/details/84832462

github源码下载地址:https://github.com/geduo83/AudioRecorder

csdn源码下载地址:https://download.csdn.net/download/geduo_83/10841496

音频录制、播放

最近在项目要用到录音的功能,研究了几天,看了很多的资料,今天在这里分享记录一下以便回头查看。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"
  }

欢迎打赏哦~~~

猜你喜欢

转载自blog.csdn.net/geduo_83/article/details/84832462