这篇文章主要为大家详细介绍了Android使用AudioRecord实现录音功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Android平台可以使用AudioRecord和MediaRecorder来实现录音,因为AudioRecord更接近底层,并且录制的数据为原始(pcm)数据,pcm数据可以再进行处理转换,直播中使用的都是处理后的pcm数据,所以在这里面学习下使用AudioRecord。
* audioSource 表示数据来源 一般为麦克风 MediaRecorder.AudioSource.MIC
* sampleRateInHz 表示采样率 一般设置为 44100
* channelConfig 表示声道 一般设置为 AudioFormat.CHANNEL_IN_MONO
* audioFormat 数据编码方式 这里使用 AudioFormat.ENCODING_PCM_16BIT
* bufferSizeInBytes 数据大小 这里使用AudioRecord.getMinBufferSize 获取
AudioRecord(int audioSource, int sampleRateInHz, int channelConfig, int audioFormat,
int bufferSizeInBytes)
private AudioRecord audioRecord = null;
private int recordBufsize = 0;
private void createAudioRecord() {
recordBufsize = AudioRecord
.getMinBufferSize(44100,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT);
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
44100,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT,
recordBufsize);
// 调用开始录音
audioRecord.startRecording();
调用开始录音后,需要从audioRecord中读取录音的数据
audioRecord.read(data, 0, recordBufsize);
AudioRecord的关键方法已经介绍了,下面贴上完整的代码
二、使用步骤
清单文件声明权限
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
关于Android 6.0动态申请权限这里就不重复了,可自行百度
public class MainActivity extends AppCompatActivity {
private static final String FILE_NAME = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC) + File.separator + "test.pcm";
private AudioRecord audioRecord = null;
private int recordBufsize = 0;
private boolean isRecording = false;
private Button startRecordBtn;
private Button stopRecordBtn;
private Thread recordingThread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1000);
if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, 2000);
startRecordBtn = findViewById(R.id.start_record_btn);
stopRecordBtn = findViewById(R.id.stop_record_btn);
createAudioRecord();
startRecordBtn.setOnClickListener(v -> {
startRecord();
stopRecordBtn.setOnClickListener(v -> {
stopRecord();
private void createAudioRecord() {
recordBufsize = AudioRecord
.getMinBufferSize(44100,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT);
Log.i("audioRecordTest", "size->" + recordBufsize);
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
44100,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT,
recordBufsize);
private void startRecord() {
if (isRecording) {
return;
isRecording = true;
audioRecord.startRecording();
Log.i("audioRecordTest", "开始录音");
recordingThread = new Thread(() -> {
byte data[] = new byte[recordBufsize];
File file = new File(FILE_NAME);
FileOutputStream os = null;
try {
if (!file.exists()) {
file.createNewFile();
Log.i("audioRecordTest", "创建录音文件->" + FILE_NAME);
os = new FileOutputStream(file);
} catch (Exception e) {
e.printStackTrace();
int read;
if (os != null) {
while (isRecording) {
read = audioRecord.read(data, 0, recordBufsize);
if (AudioRecord.ERROR_INVALID_OPERATION != read) {
try {
os.write(data);
Log.i("audioRecordTest", "写录音数据->" + read);
} catch (IOException e) {
e.printStackTrace();
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
recordingThread.start();
private void stopRecord() {
isRecording = false;
if (audioRecord != null) {
audioRecord.stop();
Log.i("audioRecordTest", "停止录音");
audioRecord.release();
audioRecord = null;
recordingThread = null;
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/start_record_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="开始录音" />
<Button
android:id="@+id/stop_record_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="结束录音" />
</LinearLayout>
运行程序,点击开始录音,本地会创建test.pcm文件并写入录音数据。
通过上面的学习,对AudioRecord有初步的了解,能使用AudioRecord来实现录音功能保存到本地。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
Android自定义View实现进度条动画2022-08-08
Android Activity View加载与绘制流程深入刨析源码2022-08-08
使用Compose制作抖音快手视频进度条Loading动画效果2022-08-08
Flutter StreamBuilder实现局部刷新实例详解2022-08-08
Android audio音频流数据异常问题解决分析2022-08-08
Android自定义View实现水波纹扩散效果2022-08-08
UI 开源组件Flutter图表范围选择器使用详解2022-08-08
Android性能优化之ViewPagers + Fragment缓存优2022-08-08
美国设下计谋,用娘炮文化重塑日本,已影响至中国2021-11-19
时空伴随者是什么意思?时空伴随者介绍2021-11-09
工信部称网盘企业免费用户最低速率应满足基本下载需求,天翼云盘回应:坚决支持,始终2021-11-05
2022年放假安排出炉:五一连休5天 2022年所有节日一览表2021-10-26
电脑版 - 返回首页
2006-2023 脚本之家 JB51.Net , All Rights Reserved.
苏ICP备14036222号