目录
-
音频采集API AudioRecord和MediaRecorder介绍
-
PCM的介绍
-
AudioRecord的使用(构造、开始录制、停止录制、其他细节点)
-
ffplay播放pcm
-
pcm转为wav
-
小结
一、音频采集API AudioRecord和MediaRecorder
AndroidSDK提供了两套音频录制的API,AudioRecord和MediaRecorder。其中MediaRecorder是更加上层的API,他可以直接对手机麦克风录入的音频数据进行压缩编码(比如 mp3),并存储为文件。而AudioRecord更底层些,让开发者能够得到内存中的PCM音频流数据,适用于需要对音频做进一步处理(比如,音效,第三方编码库进行压缩,或者网络传输等)。
MediaRecorder内部也是调用了AudioRecord与Framework层的AudioFlinger进行交互。
二、PCM的介绍
PCM(Pluse code Modulation 脉冲编码调制)是一种无压缩的音频格式。模拟音频信号经过A/D模数转换直接生成的二进制序列时,音频源数据(raw)。
声音经过麦克风,转换为一连串的电压信号,然后经过调制编码把电压信号转为数字信号。PCM格式使用三个参数来表示声音:采样率(sampleRate)、采样位数(audioFormat,有8位和16位,分大小端编码)以及声道数(channels)
采样频率:每秒取得声音样本的次数。采样频率越高,声音的质量也就越好,还原的声音就越真实,但同时它占用的资源越多。
采样位数:即采样值(将采样样本幅度量化的容量),用来衡量声音波动变化的一个参数。也能够说是声卡的分辨率。它的数值越大,分辨率就越高,所发出声音的能力越强。
声道数:有单声道和立体声之分。单声道的声音仅仅能使用一个喇叭发声,立体声的 PCM 能够使两个喇叭同时发声,更能感受到空间效果
三、AudioRecord的使用(构造、开始录制写入pcm文件,状态机)
3.1 构造AudioRecord
我们首先通过AudioRecord的构造器,来了解下需要的参数
public AudioRecord(int audioSource, int sampleRateInHz, int channelConfig, int audioFormat,
int bufferSizeInBytes)
来看下构造方法中的5个参数
audioSource:音频输入源,比如有麦克风等,通过MediaRecord.AudioSource获取。
sampleRateInHz:音频采样率,常见的采样率为44100即44.1KHZ
channelConfig:音频录制时的声道,分为单声道和立体声道,在AudioFormat中定义。
audioFormat:音频格式
bufferSizeInBytes:音频缓冲区大小,不同手机厂商有不同的实现(比如 我的一加手机该值为3584字节),可以通过下面的方法获取。
static public int getMinBufferSize(int sampleRateInHz, int channelConfig, int audioFormat)
具体使用如下:
private void createAudioRecord() {
sampleRateInHz = 44100;
channelConfig = AudioFormat.CHANNEL_IN_MONO;
audioFormat = AudioFormat.ENCODING_PCM_16BIT;
bufferSize = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat);
audioRecord = new AudioRecord(Media