Android_获取音频PCM数据

简单4步解决一切烦恼。

1. 配置

mAudioRecord = new AudioRecord(audioSource, sampleRate, channelConfig, audioFormat, Math.max(minBufferSize, DEFAULT_BUFFER_SIZE));

参数说明:

声音来源

MediaRecorder.AudioSource.CAMCORDER 
 设定录音来源于同方向的相机麦克风相同,若相机无内置相机或无法识别,则使用预设的麦克风
MediaRecorder.AudioSource.DEFAULT  默认音频源
MediaRecorder.AudioSource.MIC
设定录音来源为主麦克风。
MediaRecorder.AudioSource.VOICE_CALL
设定录音来源为语音拨出的语音与对方说话的声音
MediaRecorder.AudioSource.VOICE_COMMUNICATION
摄像头旁边的麦克风
MediaRecorder.AudioSource.VOICE_DOWNLINK
下行声音
MediaRecorder.AudioSource.VOICE_RECOGNITION
语音识别
MediaRecorder.AudioSource.VOICE_UPLINK
上行声音

采样率

根据接口说明44100是唯一在所有设备上都保证支持的。其他的采样率不保证。

通道配置

只有单通道保证在所有设备上支持。

AudioFormat.CHANNEL_IN_MONO   单通道
AudioFormat.CHANNEL_IN_STEREO 双通道

采样格式

一个PCM采样点所占用的数据格式及大小。一般常用的是16位的。

/** Audio data format: PCM 16 bit per sample. Guaranteed to be supported by devices. */
public static final int ENCODING_PCM_16BIT = 2;
/** Audio data format: PCM 8 bit per sample. Not guaranteed to be supported by devices. */
public static final int ENCODING_PCM_8BIT = 3;
/** Audio data format: single-precision floating-point per sample */
public static final int ENCODING_PCM_FLOAT = 4;

PCM数据缓冲区大小

不能小于下面最小大小,最小大小可以从下面函数获取

static public int getMinBufferSize(int sampleRateInHz, int channelConfig, int audioFormat)

2. 读取数据

将数据读取到mBuffer中。返回值为实际读取的长度

int readLen = mAudioRecord.read(mBuffer, 0, DEFAULT_BUFFER_SIZE);

3. 销毁

mAudioRecord.stop();
mAudioRecord.release();

4. 示例代码

 /** 使用默认的音频配置,回调函数用来消费音频数据,这里的音频数据是PCM,需要经过编码生成aac */
    public static void startGetAudioData(IConsumeDataCallback consumer) {

        Logcat.d(TAG, "startGetAudioData called!");

        // 配置AudioRecord
        int audioSource = MediaRecorder.AudioSource.VOICE_COMMUNICATION;
        // 所有支持android系统都支持
        int sampleRate = 44100;
        // 单声道输入
        int channelConfig = AudioFormat.CHANNEL_IN_MONO;
        // pcm_16时所有android系统都支持的
        int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
        // 计算AudioRecord内部buffer最小
        int minBufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat);
        // buffer不能小于最低要求,也不能小于我们每次我们读取的大小。
        mAudioRecord = new AudioRecord(audioSource, sampleRate, channelConfig, audioFormat, Math.max(minBufferSize, DEFAULT_BUFFER_SIZE));

        // 开始录音
        mAudioRecord.startRecording();
        isStart = true;

        mBuffer = new byte[DEFAULT_BUFFER_SIZE];

        while (isStart) {

            int readLen = mAudioRecord.read(mBuffer, 0, DEFAULT_BUFFER_SIZE);
            if (readLen <= 0) {
                break;
            }

            consumer.handle(mBuffer, readLen);
        }

        mAudioRecord.stop();
        mAudioRecord.release();
        mAudioRecord = null;

        Logcat.d(TAG, "startGetAudioData exit!");
    }

其中 consumer.handle(mBuffer, readLen); 是我写的自定义消费函数,使用接口实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值