Android 音频基础(二)——录音(AudioRecord)

在Android的世界中,一般有两种音频采集的方式,MediaRecorder和AudioRecord,但是MediaRecorder最终还是走到AudioRecord里,让AudioRecord和AudioFlinger进行交互,所以这篇博文就不介绍MediaRecoder了,主要介绍下AudioRecord的录音(音频采集)情况。

基本参数

在AudioRecord源码中我们看到初始化AudioRecord对象时需要传入这几个参数,我们就从这几个参数开始学习如何录音

1.audioSource(音源):

音源,顾名思义就是音频的来源,通过AudioSource文件我们可以看到Android给我们定义了很多不同场景的音频源模式,如MIC,VOICE_CALL,VOICE_RECOGNITION,REMOTE_SUBMIX等。

MediaRecorder.AudioSource.MIC

2.音频采样率(sampleRateInHz)

AudioRecord的第二个参数是采样率,一般设置采样率44100,官方说这个采样率能兼容所有设置,其他常用的还有48000等。

 private int sampleRateInHz = 44100;

3.声道设置(AudioFormat):

进入到AudioFormat文件中我们可以看到很多声道配置例如默认声道(CHANNEL_IN_DEFAULT),左声道(CHANNEL_IN_LEFT),右声道(CHANNEL_IN_RIGHT),立体声(CHANNEL_IN_STEREO)等。

    public static final int CHANNEL_IN_DEFAULT = 1;
    // These directly match native
    public static final int CHANNEL_IN_LEFT = 0x4;
    public static final int CHANNEL_IN_RIGHT = 0x8;
    public static final int CHANNEL_IN_FRONT = 0x10;
    public static final int CHANNEL_IN_BACK = 0x20;
    public static final int CHANNEL_IN_LEFT_PROCESSED = 0x40;
    public static final int CHANNEL_IN_RIGHT_PROCESSED = 0x80;
    public static final int CHANNEL_IN_FRONT_PROCESSED = 0x100;
    public static final int CHANNEL_IN_BACK_PROCESSED = 0x200;
    public static final int CHANNEL_IN_PRESSURE = 0x400;
    public static final int CHANNEL_IN_X_AXIS = 0x800;
    public static final int CHANNEL_IN_Y_AXIS = 0x1000;
    public static final int CHANNEL_IN_Z_AXIS = 0x2000;
    public static final int CHANNEL_IN_VOICE_UPLINK = 0x4000;
    public static final int CHANNEL_IN_VOICE_DNLINK = 0x8000;
    public static final int CHANNEL_IN_MONO = CHANNEL_IN_FRONT;
    public static final int CHANNEL_IN_STEREO = (CHANNEL_IN_LEFT | CHANNEL_IN_RIGHT);
private int channelConfig = AudioFormat.CHANNEL_IN_STEREO;

4.采样深度(audioFormat)

采样深度又称为采样精度,是将采样数据以PCM编码保存,每次采集的数据位置宽为16bit。

 private int audioFormat = AudioFormat.ENCODING_PCM_16BIT;

5.缓冲区大小(bufferSizeInBytes)

将采集的音频数据放置在缓存冲内,缓冲区的大小由采样率,声道和采样深度控制。

 bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat);

当这几个参数设置完成后,就可以对AudioRecord进行初始化了,如:

mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRateInHz, channelConfig, audioFormat, bufferSizeInBytes);

开始录音:

mAudioRecord.startRecording();

停止录音:

 mAudioRecord.stop();

保存录制文件:

  FileOutputStream fileOutputStream = new FileOutputStream(file);
            byte[] buffer = new byte[bufferSizeInBytes];
            while (isRecord) {
                int read = mAudioRecord.read(buffer, 0, buffer.length);
                if (AudioRecord.ERROR_INVALID_OPERATION != read) {
                    fileOutputStream.write(buffer);
                }
            }

最后记得权限需要加上

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

到此录音的全部内容差不多已经没有了,剩下的就需要更多的调试去验证问题。比如录音有噪音,录音不清楚,有回声等,这个还需要进一步学习

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值