MediaRecorder是Android提供的简单的录制音视频的API,它只能以文件的形式输出。这里我们要讲的是它的录音功能。
比较简单,开始录制前需要配置几个参数
private void initRecorder() {
try {
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); //设置源
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.AAC_ADTS);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); // 设置编码格式
mRecorder.setOutputFile(mRecordFile.getAbsolutePath());
mRecorder.prepare();
} catch (IOException e) {
e.printStackTrace();
}
}
MediaRecorder不支持暂停,而且需要注意的点是每次录制完后需要重新调用该方法进行配置,不然会报错
下面看全部代码
package com.codeforfree.cffaudiorecorddemo;
import androidx.appcompat.app.AppCompatActivity;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.io.File;
import java.io.IOException;
public class MediaRecordActivity extends AppCompatActivity {
private MediaRecorder mRecorder;
private File mRecordFile;
private RecordStatus mRecordStatus;
private Button mRecordBtn;
private TextView mResultText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_media_record);
mRecordBtn = findViewById(R.id.record_btn);
mResultText = findViewById(R.id.result_text);
mRecordFile = new File(getExternalFilesDir(""), "demo.aac");
mRecordStatus = RecordStatus.IDLE;
mRecordBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onButtonClick();
}
});
}
/**
* 每次录完必须重新调调用此方法,不然会报错
**/
private void initRecorder() {
try {
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); //设置源
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.AAC_ADTS);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); // 设置编码格式
mRecorder.setOutputFile(mRecordFile.getAbsolutePath());
mRecorder.prepare();
} catch (IOException e) {
e.printStackTrace();
}
}
private void onButtonClick() {
if (mRecordStatus == RecordStatus.IDLE) {
startRecord();
mRecordBtn.setText("结束录制");
mResultText.setText("录制中...");
} else if (mRecordStatus == RecordStatus.RECORDING) {
stopRecord();
mRecordBtn.setText("开始录制");
mResultText.setText("文件存储在" + mRecordFile.getAbsolutePath());
}
}
private void startRecord() {
initRecorder();
mRecordStatus = RecordStatus.RECORDING;
mRecorder.start();
}
private void stopRecord() {
if (mRecorder != null && mRecordStatus == RecordStatus.RECORDING) {
mRecordStatus = RecordStatus.IDLE;
mRecorder.stop();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mRecorder != null) {
mRecorder.release();
}
}
enum RecordStatus {
IDLE,
RECORDING
}
}