介绍
人耳可以听到的声音频率在20HZ~20kHz之间的声波,称为音频。
音频本身是模拟信号,通过AD采样转换变成数字信号,这些数字信号称为PCM数据,采样参数有采样率,比特,通道等。
- 采样率指每秒采集多少次,一般有16000hz,44100hz。
- 比特代表每采一次用多少位表示,一般有8位,16位。
- 通道代表使用多少条并行ad采样器,一般分单通道和双通道。
PCM数据虽然能保存音频文件,但给用户使用时却不知道上面的三个信息,造成解码问题,因此,一般在PCM文件前加个头,用来指示PCM数据信息。
Wav是音频最简单的无压缩格式,本身由三部分组成。
结构
头部
包含12个字节共三个参数:
- 资源交换档案标准(Resource Interchange File Format) (RIFF)头部:固定为“RIFF”,占用4个字节。
- ChunkSize:它等于PCM数据字节数+36。
- Format:固定为“WAVE”
格式
- Subchunk1ID:固定为“fmt”。
- Subchunk1Size:代表格式段剩余多少字节。
- AudioFormat:音频格式,PCM = 1,因此一般为1.
- NumChannels:通道数量,Mono = 1, Stereo = 2。
- SampleRate:采样率,8000,16000,44100。
- ByteRate:比特率,等于SampleRate * NumChannels * BitsPerSample/8。
- BlockAlign:代表每一帧的字节数量,等于NumChannels * BitsPerSample/8。
- BitsPerSample:位数,8 bits = 8, 16 bits = 16等。
- ExtraParamSize:如果是PCM, 该字段不存在。
- ExtraParams:如果是PCM,该字段不存在。
数据
- Subchunk2ID:固定为“data”。
- Subchunk2Size:表示实际的音频数据字节总数,等于NumSamples * NumChannels * BitsPerSample/8。
- Data:PCM数据。
注意
在文档中,除了PCM数据部分,其它部分都是采用大端模式存储, 但是本人在windows10系统中亲测,发现wav全都是采用小端模式存储。
如下图:
该文件大小为32046,对应上述ChunkSize(4-8字节)应该是00007D26,在图中存储变成267D0000,由此证明是采用小端模式。
很多嵌入式芯片,如ARM,MIPS等采集出来的PCM是小端模式,而JAVA虚拟机和网络传输统一采用大端模式,因此数据不能直接使用,需要把数据小端转大端先。
实践
如下图片就是android开发的app,采集音频数据的例子: