版权声明:本文为原创文章,未经允许不得转载
一、录制和播放PCM音频流
1.录制
- 抽取音频配置文件
/**
* Created by Kevin on 2016/10/24.
* 音频配置文件
*/
public class AudioConfig {
public static final int sampleRateInHz = 44100; // 采样频率
public static final int channelConfigIn = AudioFormat.CHANNEL_IN_STEREO; // 双声道输入(立体声)
public static final int audioFormat = AudioFormat.ENCODING_PCM_16BIT; // 16bit
public static final int audioSource = MediaRecorder.AudioSource.MIC; // mic
public static final int streamType = AudioManager.STREAM_MUSIC; // 音频类型
public static final int channelConfigOut = AudioFormat.CHANNEL_OUT_STEREO; // 双声道输出
public static final int mode = AudioTrack.MODE_STREAM; // 输出模式
public static final String DEFAULT_WAV_PATH = Environment.getExternalStorageDirectory() + "/test.wav"; // WAV音频文件保存路径
}
- 配置AudioRecord
private int DEFAULT_SAMPLERATEINHZ = AudioConfig.sampleRateInHz; // 采样频率
private int DEFAULT_CHANNELCONFIG_IN = AudioConfig.channelConfigIn; // 声道配置
private int DEFAULT_AUDIOFORMAT = AudioConfig.audioFormat; // 音频格式
private int DEFAULT_AUDIOSOURCE = AudioConfig.audioSource; // 音频来源
注意:
① 采样频率为44.1KHz,位宽为16bit,录制出来的PCM音频一般称为无损音频,也是传统的CD格式;
② 声道配置为立体声(双声道),音频来源为麦克风;
③ 输出模式为音频流模式,表示不是直接播放音频文件,而是播放音频数据流;
如果对于各个参数 不是很理解或者音频相关的基础较弱,可以先看前一篇的音频基础。
- 音频录制的流程
1. 获取最小的缓冲区大小
2. 创建AudioRecord实例
3. 创建录音线程
4. 开始录音
5. 读取语音信息
6. 停止录音
- 代码
private static final String tag = "【AudioRecorder】";
private int DEFAULT_SAMPLERATEINHZ = AudioConfig.sampleRateInHz; // 采样频率
private int DEFAULT_CHANNELCONFIG_IN = AudioConfig.channelConfigIn; // 声道配置
private int DEFAULT_AUDIOFORMAT = AudioConfig.audioFormat; // 音频格式
private int DEFAULT_AUDIOSOURCE = AudioConfig.audioSource; // 音频来源
private RecorderThread recorderThread; // 录音线程
private AudioRecord recorder; // 录音对象
private boolean isRunning; // 录音线程是否运行
private boolean isWorking; // 录音线程是否工作(录音)
private onRecorderListener recorderListener;
private int recordBufferSize;
public AudioRecorder(onRecorderListener recorderListener) {
this.recorderListener = recorderListener;
init();
}
/** 初始化 */
private void init() {
LogUtil.i(tag, "开始创建录音对象...");
//1. 获取最小的缓冲区大小
recordBufferSize = AudioRecord.getMinBufferSize(DEFAULT_SAMPLERATEINHZ,
DEFAULT_CHANNELCONFIG_IN, DEFAULT_AUDIOFORMAT);
switch (recordBufferSize) {
case AudioRecord.ERROR_BAD_VALUE:
LogUtil.i(tag, "无效的音频参数");
break;
case AudioRecord.ERROR:
LogUtil.i(tag, "不能够查询音频输入的性能");
break;
default:
LogUtil.i(tag, "AudioRecord的音频缓冲区的最小尺寸(与本机硬件有关):" + recordBufferSize);
break;
}
//2. 创建AudioRecord实例
recorder = new AudioRecord(D