版权声明:本文为原创文章,未经允许不得转载
一、AudioRecord
简介
在Java应用中,AudioRecord类管理着音频来源,使用平台的音频输入硬件来录音。然后,我们可以从AudioRecord类中将录音的数据“拉”出来。其中,我们获取数据的方法有三种:
- read(byte[],int, int)
- read(short[], int, int)
- sread(ByteBuffer, int)
至于选择哪个方法来获取数据,取决于我们需要的数据格式,需要哪种格式就使用哪种方法。
一旦我们创建成功了AudioRecord类并调用了read方法,它就会使用新的录音得到的数据来填充与之相关的音频缓冲区。缓冲区的大小是在构造方法中定义的,长度取决于不会使得有多余的音频没有录制到。
源码分析
- 构造方法
/**
构造方法
- 由于一些无效的参数或者其他错误会抛出IllegalArgumentException,所以在你构造了一个AudioRecord实例之后,需要立刻调用 getState() 方法来判断这个实例的状态是否可以使用。
参数:
- audioSource:录音来源,查看MediaRecorder.AudioSource类对录音来源的定义。
MediaRecorder.AudioSource.DEFAULT 默认音频来源
MediaRecorder.AudioSource.MIC 麦克风
MediaRecorder.AudioSource.VOICE_UPLINK 上行线路的声音来源
...
一般情况下,我们使用麦克风即可。
- sampleRateInHz:采样率,单位Hz(赫兹)。44100Hz是目前唯一一个能够在所有的设备上使用的频率,但是一些其他的例如22050、16000、11025也能够在一部分设备上使用。
- channelConfig:音频声道的配置(输入)
AudioFormat.CHANNEL_IN_MONO:单声道
AudioFormat.CHANNEL_IN_STEREO:立体声
其中,CHANNEL_IN_MONO可以保证在所有设备上使用。
- audioFormat:返回的音频数据的编码格式
AudioFormat.ENCODING_INVALID:无效的编码格式
AudioFormat.ENCODING_DEFAULT:默认的编码格式
AudioFormat.ENCODING_PCM_16BIT:每份采样数据为PCM 16bit,保证所有设备支持
AudioFormat.ENCODING_PCM_8BIT:样本数据格式为PCM 8bit,不保证所有设备支持
AudioFormat.ENCODING_PCM_FLOAT:单精度浮点样本
...
- bufferSizeInBytes:在录音时期,音频数据写入的缓冲区的整体大小(单位字节),即缓冲区的大小。我们能够从这个缓冲区中读取到不超过缓冲区长度的整块数据。可以通过 getMinBufferSize(int, int, int) 这个方法来决定我们使用的AudioRecord实例所需要的最小的缓冲区的大小,如果我们使用的数值比这个还要小,则会导致AudioRecord实例初始化失败。
*/
public AudioRecord(int audioSource, int sampleRateInHz, int channelConfig, int audioFormat,
int bufferSizeInBytes);