1.调用系统的录音机并返回录制结果
https://blog.csdn.net/yu540135101/article/details/103655058
2.使用AudioRecord返回PCM数据
package com.zhangyu.myopengl.encoder;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
public class AudioRecordUtil {
private static final String TAG = "AudioRecordUtil";
private AudioRecord audioRecord;
private int bufferSize;
private int readSize;
private boolean isStart;
private int sample_rate = 44100;
public AudioRecordUtil() {
bufferSize = AudioRecord.getMinBufferSize(
sample_rate,
AudioFormat.CHANNEL_IN_STEREO,
AudioFormat.ENCODING_PCM_16BIT);
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
sample_rate,
AudioFormat.CHANNEL_IN_STEREO,
AudioFormat.ENCODING_PCM_16BIT,
bufferSize);
}
private OnRecordListener onRecordListener;
public void setOnRecordListener(OnRecordListener onRecordListener) {
this.onRecordListener = onRecordListener;
}
public interface OnRecordListener {
void isStart();
void readByte(byte[] audioData, int size);
}
/**
* 开始
*/
public void startRecord() {
new Thread(new Runnable() {
@Override
public void run() {
isStart = true;
audioRecord.startRecording();
byte[] audioData = new byte[bufferSize];
if (onRecordListener != null) {
onRecordListener.isStart();
}
while (isStart) {
readSize = audioRecord.read(audioData, 0, bufferSize);
if (onRecordListener != null) {
onRecordListener.readByte(audioData, readSize);
}
}
//释放
audioRecord.stop();
audioRecord.release();
audioRecord = null;
}
}).start();
}
/**
* 停止
*/
public void stopRecord() {
isStart = false;
}
}
3.使用MediaRecorder录制
package com.zhangyu.myopengl.utils;
import android.content.Context;
import android.media.MediaRecorder;
import android.os.Environment;
import android.util.Log;
import java.io.File;
import java.io.IOException;
public class MediaRecorderUtil {
private static final String TAG = "MediaRecorderUtil";
private String path;
private MediaRecorder recorder;
private Type type = Type.AAC_AAC;
/**
* 枚举了两种常用的类型
*/
public enum Type {
AAC_M4A(".m4a", MediaRecorder.AudioEncoder.AAC, MediaRecorder.OutputFormat.MPEG_4),
AAC_AAC(".aac", MediaRecorder.AudioEncoder.AAC, MediaRecorder.OutputFormat.AAC_ADTS),
AMR_AMR(".amr", MediaRecorder.AudioEncoder.AMR_NB, MediaRecorder.OutputFormat.AMR_NB);
String ext;
int audioEncoder;
int outputFormat;
Type(String ext, int audioEncoder, int outputFormat) {
this.ext = ext;
this.audioEncoder = audioEncoder;
this.outputFormat = outputFormat;
}
}
/**
* 初始化
* @param context
*/
public MediaRecorderUtil(Context context) {
String fileName = "recorder_" + System.currentTimeMillis() + type.ext;
Log.e(TAG, "MediaRecorderUtil: fileName=" + fileName);
// String fileDir = context.getFilesDir() + "/record";
String fileDir = Environment.getExternalStorageDirectory() + "/1";
File file = new File(fileDir);
//判断文件夹是否存在,如果不存在则创建文件夹
if (!file.exists()) {
file.mkdirs();
}
file = new File(fileDir, fileName);
path = file.getAbsolutePath();
}
/**
* 开始录制
*/
public void start() {
try {
recorder = new MediaRecorder();
recorder.setOutputFile(path);
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(type.outputFormat);
recorder.setAudioEncoder(type.audioEncoder);
recorder.prepare();
recorder.start();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 停止录制
*/
public void stop() {
if (recorder != null) {
recorder.stop();
recorder.release();
recorder = null;
}
}
/**
* 获取音频的振幅
* @return
*/
public float getVoiceLevel() {
float level = 0.1f;
try {
if (recorder != null) {
// getMaxAmplitude()的范围是 1-32767
// mediaRecorder.getMaxAmplitude()/32768 占总量的百分比
// 这里7*mediaRecorder.getMaxAmplitude()/32768 的最大值为6
level = recorder.getMaxAmplitude() / 32768f;
return level;
}
} catch (Exception e) {
e.printStackTrace();
}
return level;
}
}