当前位置: 代码迷 >> 综合 >> 音频笔记-AudioRecord
  详细解决方案

音频笔记-AudioRecord

热度:77   发布时间:2023-12-17 08:16:25.0

前言:上文讲了 AudioTrack 今天讲一讲AudioRecord如何录制PCM音频。

基本构造

先说一下基本构造

audioRecord = new AudioRecord.Builder().setAudioSource(MediaRecorder.AudioSource.MIC).setBufferSizeInBytes(mBufferSize).setAudioFormat(new AudioFormat.Builder().setSampleRate(44100).setChannelMask(AudioFormat.CHANNEL_IN_MONO).setEncoding(AudioFormat.ENCODING_PCM_16BIT).build()).build();

另一种构造

audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, 44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, mBufferSize);

参数

其他参数和AudioTrack的参数差不多
这里只讲一个

setAudioSource

例如
setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION)

讲几个可用的值,其他值都是系统预留的,第三方软件无法使用。

属性 释义(翻译来自官方)
MIC 普通麦克风
VOICE_COMMUNICATION 克风音频源已针对VoIP等语音通信进行了调整。例如,它将利用回声消除或自动增益控制(如果可用)的优势。(我项目里是这个,自动除杂的MIC,声音效果能好点)
VOICE_RECOGNITION 用于捕获要实时处理并回放以进行现场表演(例如卡拉OK)的音频的来源。捕获路径将最大程度地减少延迟,并与播放路径耦合。
VOICE_PERFORMANCE 麦克风音频源经过了语音识别。

getMinBufferSize

和AudioTrack的差不多

mBufferSize = AudioRecord.getMinBufferSize(44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);

录制pcm并保存为文件:

开始录制

public void record() {
    if (audioRecord == null) {
    //为空return;}if (audioRecord.getState() != AudioRecord.STATE_INITIALIZED) {
    //尚未初始化return;}new Thread(new Runnable() {
    @Overridepublic void run() {
    try {
    //文件名String filePath;//要保存的文件路径//初始化outPutStreamfileOutputStream = new FileOutputStream(filePath);byte[] audioDataArray = new byte[mBufferSize];//一次写入的最小单位数//开启audioRecord.startRecording();while ((audioRecord.read(audioDataArray, 0, mBufferSize)) > 0) {
    //不停的写入fileOutputStream.write(audioDataArray);}} catch (Exception e) {
    e.printStackTrace();} finally {
    try {
    if (null != fileOutputStream) {
    fileOutputStream.close();fileOutputStream = null;}} catch (IOException e) {
    e.printStackTrace();}}}}).start();}

停止

public void stop() {
    if (audioRecord.getState() == AudioRecord.STATE_INITIALIZED) {
    audioRecord.stop();}}

权限

因为是录制并且有写入文件的操作所以权限有:

  • 文件操作
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  • 音频相关
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /><uses-permission android:name="android.permission.RECORD_AUDIO" />

Demo地址

https://github.com/tc7326/audio.video.demo