数字音频
数字音频通常分为三步:采样、量化、编码
采样:就是将获取的信号给数字化,其中有个概念就是采样频率,而人耳能听到的频率范围只有20Hz~20kHz,所以一般设置的都是44.1kHz
量化:就是如何去表达采样的数据,常用使用二进制来表示声音信号的幅度
编码:如何去保存采样和量化过后的数据,这就出现了很多格式,其中最基础的格式就是PCM(脉冲编码调制),就是裸数据格式完全没有压缩,PCM格式中有几个属性:量化格式、采样率、声道数
量化格式:即使用多少比特的二进制去进行量化,例如我们使用16比特的二进制信号来进行量化,16比特的二进制范围是-32768到32767,范围大小为65536,所以声音分层就比较多,但是对应的是数据大小会增大
采样率:即前面采样中所说的采样频率
声道数:即单声道还是双声道以及更多声道
比特率:
每秒传送的比特(bit)数。单位为 bps(Bit Per Second),比特率越高,传送数据速度越快。
采样率x采样大小x声道数
每秒钟采样的大小=16bit(位宽) * 2(双通道) * 44100(每次采样的次数hz) = 1411200b=1411.2kbps
Android中的音频采集——AudioRecord的使用
在android中我们使用AudioRecord来进行音频采集,采样量化编码全套服务最后输出PCM数据
权限
首先要申请android.permission.RECORD_AUDIO权限
AudioRecord的初始化
audioSize = AudioRecord.getMinBufferSize(44100,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT);
audioRecord = new AudioRecord(
MediaRecorder.AudioSource.MIC,
44100,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT,
audioSize);
我们可以看见初始化AudioRecord的几个属性
streamType 音频来源,例如麦克风MediaRecorder.AudioSource.MIC
sampleRateInHz 采样频率
channelConfig 声道数
AudioFormat.CHANNEL_IN_MONO 单声道,一个声道进行采样
AudioFormat.CHANNEL_IN_STEREO 双声道,两个声道进行采样
audioFormat:量化格式
- 音频采样精度
指定采样的数据的格式和每次采样的大小。
数据返回格式为 PCM
格式
每次采样的位宽为 16bit
一般都采用这个 AudioFormat.ENCODING_PCM_16BIT(官方文档表示,该采样精度保证所有设备都支持
)
bufferSizeInBytes:通过 getMinBufferSize()方法可以获得,根据我们采样录制的过程中的参数来确定,每次从硬件读取数据所需要的缓冲区的大小。
getMinBufferSize()
返回成功创建AudioRecord对象所需的最小缓冲区大小(以字节为单位)。没有实际意义。
我们可以发现初始化所需要的属性基本就是PCM的属性
AudioRecord的使用
初始化完之后,AudioRecord使用就很简单了
while (isRecording) {
int readResult = audioRecord.read(bytes, 0, audioSize);
for (int i = 0; i < readResult; i++) {
outputStream.write(bytes[i]);
}
}
我们用关键字来控制无限循环,当停止录制的时候就关键字就控制while循环停止,然后在while循环中我们使用read方法,read方法会把数据传入byte数组中并返回数组大小,我们用for循环将byte数组中的数据用文件输出流输出到文件中,这就完成了PCM数据的采集,最后记住关闭audioRecord就可以了
以上就是在android中音频的采集