aac mediarecorder录制_GitHub - zhangjunpu/AudioRecorder: Android 音频录制、播放,最近在项目要用到录音的功能,研究了几天,看了很多的资料,今...

音频录制、播放

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

}

}

问题反馈

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

关于作者

var geduo_83 = {

nickName : "geduo_83",

site : "http://www.weibo.com/geduo83"

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值