录音有3种方式:https://www.cnblogs.com/wzzkaifa/p/7298608.html
下面是给大家,通过MediaRecorder来进行音频的录制 aar格式的音频。我封装一个类给大家。
public class Recorder {
MediaRecorder mediaRecorder;
private static Recorder instance;
private File mAudioFile;
private RecordViewDialog recordViewDialog;
private RecordListener recordListener;
long mStartRecordTime;
long mStopRecordTime;
Context mContext;
MediaPlayer mMediaPlayer;
private Recorder( Context context) {
mContext =context;
}
public static synchronized Recorder getInstance( Context context) {
if (instance == null) {
instance = new Recorder(context);
}
return instance;
}
public Recorder setListener(RecordListener listener) {
recordListener = listener;
return instance;
}
public void start(Context context) {
record(context);
recordViewDialog = new RecordViewDialog(context, R.style.Dialog, onClickListener);
recordViewDialog.show();
}
/**
* 开始录音
*/
@SuppressLint("WrongConstant")
private void record(Context mContext){
// File file = new File("/sdcard/mediarecorder.amr");
if (!Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)){
Toast.makeText(mContext,"SD卡不存在,请插入SD卡!",5000).show();
return;
}
//释放之前录音的recorder
releaseRecorder();
//执行录音逻辑,如果失败 提示用户
if (!doStart()) {
recordFail(mContext);
}
}
private boolean doStart() {
try {
//创建mediaRecorder
mediaRecorder = new MediaRecorder();
//创建录音文件
mAudioFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/yinping/" + "lunzhi.aac");
mAudioFile.getParentFile().mkdirs();
mAudioFile.createNewFile();
//配置Media Recorder
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setAudioSamplingRate(44100);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mediaRecorder.setAudioEncodingBitRate(96000);
//设置录音文件的位置
mediaRecorder.setOutputFile(mAudioFile.getAbsolutePath());
//开始录音
mediaRecorder.prepare();
mediaRecorder.start();
//记录开始录音时间 用于统计时长
mStartRecordTime = System.currentTimeMillis();
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
private boolean doStop() {
//停止录音
try {
mediaRecorder.stop();
//记录停止时间
handler.postDelayed(new Runnable() {
@Override
public void run() {
if (recordViewDialog != null) recordViewDialog.dismiss();
}
}, 100);
//停止成功
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* 停止录音
*/
private void stop2(){
//执行停止录音逻辑,失败就要提醒用户
if (!doStop()) {
recordFail(mContext);
}
//释放recorder
releaseRecorder();
}
private void releaseRecorder() {
//检查mediaRecorder不为空
if (mediaRecorder != null) {
mediaRecorder.release();
mediaRecorder = null;
}
}
private View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
stop2();
int i = v.getId();
if (i == R.id.ok) {
mStopRecordTime=System.currentTimeMillis();
//只接受超过三秒的录音
final int second = (int) (mStopRecordTime - mStartRecordTime)/1000;
if (second>3){
recordListener.onComplete(mAudioFile.getAbsolutePath(),second);
} else {
// recordListener.onComplete("",second);
Tools.toast(mContext,"说话时长小于3秒!");
}
} else if (i == R.id.delete) {
recordListener.onCancel();
}
}
};
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
private void recordFail(Context mContext) {
mAudioFile = null;
Toast.makeText(mContext, "录音失败", Toast.LENGTH_SHORT).show();
}
public void startPlay(String audioFile) {
//配置播放器
mMediaPlayer = new MediaPlayer();
try {
//设置声音文件
mMediaPlayer.setDataSource(audioFile);
//设置监听回掉
mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
stopPlay();
}
});
mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
//提示用户 释放播放器
playFail();
stopPlay();
return true;
}
});
//配置音量 是否循环
mMediaPlayer.setVolume(1, 1);
mMediaPlayer.setLooping(false);
//准备 开始
mMediaPlayer.prepare();
mMediaPlayer.start();
} catch (RuntimeException e) {
e.printStackTrace();
//异常处理防止闪退
playFail();
} catch (IOException e) {
e.printStackTrace();
}
}
private void stopPlay() {
//重置播放状态
if (mMediaPlayer != null) {
mMediaPlayer.setOnCompletionListener(null);
mMediaPlayer.setOnErrorListener(null);
mMediaPlayer.stop();
mMediaPlayer.reset();
mMediaPlayer.release();
mMediaPlayer = null;
}
}
private void playFail() {
Toast.makeText(mContext, "播放失败", Toast.LENGTH_SHORT).show();
}
}
本文介绍了一种使用MediaRecorder在Android设备上进行音频录制的方法,详细解释了如何创建、配置和控制MediaRecorder实例,以及如何处理录音文件。
1105

被折叠的 条评论
为什么被折叠?



