Android AudioRecoder音频采集

2019-08-20  本文已影响0人  懒烂蓝

1、简介

Android中用于音频采集的API包括两种,MediaRecoder和AudioRecoder。

2、AudioRecoder的创建

public AudioRecord(int audioSource, int sampleRateInHz, int channelConfig, int audioFormat,
            int bufferSizeInBytes)

3、音频采集

创建好AudioRecoder之后,就可以调用AudioRecord.startRecording()方法来开始采集。这里记得添加录音权限:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
AudioRecord.stop()方法用于停止录音。
使用完AudioRecoder后记得调用AudioRecoder.release()方法释放掉。
AudioRecoder会将采集的音频数据放到缓存区中。所以我们在采集的同时,需要开启一个新线的线程将采集的数据及时的读取出来。如果读取不及时读出数据会出现overrun。数据读取调用:
AudioRecord.read(byte[] audioData, int offsetInBytes, int sizeInBytes);

4、代码示例

    private static final int SAMPLE_RATE_IN_HZ = 44100;
    private static final int CHANNEL_CONFIG = AudioFormat.CHANNEL_IN_MONO;
    private static final int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT;

    /**
     * 初始化AudioRecoder
     */
    private void initAudioRecorder() {
        /**
         * sampleRateInHz 指定采集音频的采样频率,比较通用的是44100(44.1kHz),这个值是科学家们通过奈葵斯特采样定理得出的一个人能接受最佳的采样频率值
         * channelConfig 指定AudioRecord采集几个声道的声音,预设值定义在AudioFormat中,常用值有 CHANNEL_CONFIGURATION_MONO(单声道) 和 CHANNEL_CONFIGURATION_STEREO(双声道)
         * audioFormat 指定采样PCM数据的采样格式,预设值定义在也AudioFormat中,常用值有 ENCODING_PCM_8BIT、ENCODING_PCM_16BIT和ENCODING_PCM_FLOAT,值得强调的是ENCODING_PCM_16BIT可以保证兼容大部分Andorid手机
         *
         */
        recordBufSize = AudioRecord.getMinBufferSize(SAMPLE_RATE_IN_HZ, CHANNEL_CONFIG, AUDIO_FORMAT);
        /**
         * bufferSizeInBytes 配置AudioRecord内部的音频数据缓冲区,一般来说缓存区越小,产生的音频延迟也越小;值得注意的是,我们可以利用AudioRecord.getMinBufferSize()这个方法帮我们算出最小的缓存区大小,这个数值最好不要自己计算,毕竟不同厂商可能有不同的缓存区采集实现
         */
        audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE_IN_HZ, CHANNEL_CONFIG, AUDIO_FORMAT, recordBufSize);

        if (audioRecord.getState() == AudioRecord.STATE_INITIALIZED) {
            mState = 1;
            Log.e(TAG, "onCreate: AudioRecord创建成功,recordBufSize = " + recordBufSize);
        } else {
            Log.e(TAG, "onCreate: AudioRecord创建失败");
        }
    }

    /**
     * 开始录音
     */
    private void startRecord() {
        if (baos != null) {
            try {
                baos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            baos = null;
        }
        baos = new ByteArrayOutputStream();
        //开始录音
        audioRecord.startRecording();
        //修改状态为开始录音
        mState = 2;
        //开启线程
        new CollectThread().start();
    }

    /**
     * 停止录音
     */
    private void stopRecord() {
        audioRecord.stop();
        audioRecord.release();
        mState = 0;
    }

    /**
     * 采集线程
     */
    class CollectThread extends Thread {
        @Override
        public void run() {
            int read;
            while (mState == 2) {
                //创建byte数据用户保存录音数据
                byte[] pcmData = new byte[recordBufSize];
                //根据recordBufSize从audioRecord中读取指定长度的数据存入mPcmData
                read = audioRecord.read(pcmData, 0, recordBufSize);
                if (read >= AudioRecord.SUCCESS) {
                    synchronized (AudioRecordActivity.class) {
                        //保存数据到OutputStream
                        try {
                            baos.write(pcmData);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }

这里只是介绍了使用AudioRecoder进行音频数据的采集,示例代码只是部分代码。在这里记录一下自己学习的过程。

上一篇 下一篇

猜你喜欢

热点阅读