# AudioRecorder **Repository Path**: android100/AudioRecorder ## Basic Information - **Project Name**: AudioRecorder - **Description**: Android 音频录制、播放,最近在项目要用到录音的功能,研究了几天,看了很多的资料,今天在这里分享记录一下以便回头查看。Android给我们提供了两个录音的API接口:MediaRecord、AudioRecoder - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-08-12 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 音频录制、播放 最近在项目要用到录音的功能,研究了几天,看了很多的资料,今天在这里分享记录一下以便回头查看。Android给我们提供了两个录音的API接口:MediaRecord、AudioRecoder ### MediaRecord: #### 1. 优点: * 可以录制音频、视频 * 提供了录制、压缩、编码等功能 * 使用简单方便,几行代码就可实现 #### 2. 缺点: * 可以录制的视频格式较少 * 录制的过程中不能暂停 * 不能实时处理音频数据(实时对讲的话用它就不适合了) #### 3. 注意: * 模拟器不支持音频、视频录制,只能在真机上测试 * 录制一定打开录制权限 `````` * 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(); } } ``` ## 问题反馈 在使用中有任何问题,欢迎反馈给我,可以用以下联系方式跟我交流 * QQ:303704981 * email:geduo_83@163.com * weibo:[@geduo_83](http://www.weibo.com/geduo83) ## 关于作者 ``` var geduo_83 = { nickName : "geduo_83", site : "http://www.weibo.com/geduo83" } ```