返回

Android_获取音频PCM数据

发布时间:2022-11-13 02:07:53 345
# android# 数据# 设备

简单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); 是我写的自定义消费函数,使用接口实现。

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
单片机 - MC74HC153D 选择开关 2022-11-13 01:57:50