音频笔记-AudioRecord

前言:上文讲了 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() {
            @Override
            public void run() {
                try {
                    //文件名
                    String filePath;//要保存的文件路径
                    //初始化outPutStream
                    fileOutputStream = 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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值