赞
踩
数字音频通常分为三步:采样、量化、编码
采样:就是将获取的信号给数字化,其中有个概念就是采样频率,而人耳能听到的频率范围只有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来进行音频采集,采样量化编码全套服务最后输出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中音频的采集
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。