Android使用AudioRecord实现录音功能

Android使用AudioRecord实现录音功能

前言

Android使用AudioRecord实现录音

提示:以下是本篇文章正文内容,下面案例可供参考

一、AudioRecord使用

Android平台可以使用AudioRecord和MediaRecorder来实现录音,因为AudioRecord更接近底层,并且录制的数据为原始(pcm)数据,pcm数据可以再进行处理转换,直播中使用的都是处理后的pcm数据,所以在这里面学习下使用AudioRecord。

构造AudioRecord

AudioRecord类的构造方法中有5个参数

/** * 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)

创建AudioRecord对象

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.stop();

释放资源

audioRecord.release();

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来实现录音功能保存到本地。

推荐阅读