MediaRecorder之音频录制

一 前言
         在前面已经介绍过使用 MediaPlayer播放音频,那么Android也提供了录制音频、视频的类 MediaRecorder,接下来就是看看音频录制的过程。
二 音频录制
      音频录制步骤如下:
(1)创建MediaRecorder对象实例,可以通过默认的构造方法进行创建;
(2)设置音频来源、编码格式、编码位率、采样率等,分别通过(1)获取的实例调用如下方法进行设置setAudioSource(一般为麦克风MIC)、setAudioEncoder、setAudioEncodingBitRate、setAudioSamplingRate等,这些参数可以控制声音的品质、文件的大小,一般来说,声音品质越大,产生的音频文件越大;
(3)设置输出文件(音频文件)的格式,及保存位置分别通过(1)获取的实例调用如下方法setOutputFormat、setOutputFile;
(4)调用prepare方法做录制前的准备工作;
(5)调用start、pause、stop方法控制录制过程;
实现代码如下:

    public void startRecord() {
if (isRecording) {
return;
}
startRecordTime = System.currentTimeMillis();
stopRecordTime = -1;
fileName = System.currentTimeMillis() + ".amr";
File file = new File(PATH_USER_AUDIO , fileName);
// if (!file.exists()) {
// try {
// file.createNewFile();
// } catch (IOException e) {
// e.printStackTrace();
// return;
// }
// }
mRecorder = new MediaRecorder();
//设置音频源(使用麦克风录音)
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//设置所录制的音频文件的格式 AMR用于移动设备的音频,压缩比比较大,
// 但相对其他的压缩格式质量比较差,由于多用于人声,通话,效果还是很不错的。
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
//设置所录音的编码格式
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
//设置录制的音频文件的保存位置
mRecorder.setOutputFile(file.getAbsolutePath());

try {
mRecorder.prepare();
} catch (IOException e) {
e.printStackTrace();
}
try {
//开始录制
mRecorder.start();
} catch (Exception e) {
e.printStackTrace();
isNormallyRecord =false;
return;
}
isNormallyRecord =true;
sendMessage(handler, STATE_START_RECORD);
isRecording = true;
}
   说明PATH_USER_AUDIO为音频文件保存的目录。接下来自定义一个接口监听录制的进度,如下:
/**
* 录音状态更改监听
*/
public interface RecordChangeListener {
/**
* 录音状态更改监听
*
* @param state
* 当前状态
* @param fileName
* 录音文件名
* @param ema
* 录音当前振幅滤波指数
* @param recordLength
* 录音长度
*/
public void onChange(int state, String fileName, double ema, long recordLength);
}
创建一个Handle对象,循环更新进度,如下:
/** 异步刷新handler对象 */
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (null == mChangeListener) {
return;
}
switch (msg.what) {
case STATE_START_RECORD://开始录制
mChangeListener.onChange(STATE_START_RECORD, fileName, getAmplitudeEMA(), recordTimeLeng);
handler.postDelayed(runnable, STATE_REFRESH_TIME);
break;
case STATE_RECORDING:
//循环发送进度
handler.postDelayed(runnable, STATE_REFRESH_TIME);
break;
case STATE_STOP_RECORD://停止录制
mChangeListener.onChange(STATE_STOP_RECORD, fileName, getAmplitudeEMA(), recordTimeLeng);
handler.removeCallbacks(runnable);
break;
}
}

};
上述的runnable实现如下:
private Runnable runnable = new Runnable() {
@Override
public void run() {
mChangeListener.onChange(STATE_RECORDING, fileName, getAmplitudeEMA(), recordTimeLeng);
handler.postDelayed(runnable, STATE_REFRESH_TIME);
}
};
停止录制的方法实现代码如下:
public void stopRecord() {
if (isRecording) {
stopRecordTime = System.currentTimeMillis();
recordTimeLength = stopRecordTime - startRecordTime;
if (mRecorder != null) {
try {
mRecorder.stop();
mRecorder.release();
} catch (Exception e) {
// TODO: handle exception
} finally {
mRecorder = null;
isRecording = false;
sendMessage(handler, STATE_STOP_RECORD);
}
}
mRecorder = null;
isRecording = false;
sendMessage(handler, STATE_STOP_RECORD);
}
}
上述sendMessage实现如下:
private void sendMessage(Handler handler, int what) {
Message message = handler.obtainMessage();
message.what = what;
handler.sendMessage(message);
}
嗯,到这里调用上面的startRecord方法就可以开始录制音频了。
必要的权限设置:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<!-- 使用音场必要的权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.CAMERA" />

完整示例代码


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值