PCM音频采样数据处理

PCM音频采样数据处理

  PCM 脉冲编码调制是Pulse Code Modulation的缩写。脉冲编码调制是数字通信的编码方式之一。主要过程是将话音、图像等模拟信号每隔一定时间进行取样,使其离散化,同时将抽样值按分层单位四舍五入取整量化,同时将抽样值按一组二进制码来表示抽样脉冲的幅值。
编码过程:模拟信号数字化必须经过三个过程,即抽样、量化和编码,以实现话音数字化的脉冲编码调制(PCM,Pulse Coding Modulation)技术。

补充知识:

  ① PCM16LE双声道数据中左声道和右声道的采样值是间隔存储的。每个采样值占用2Byte空间。其采样格式为16LE。“16”代表采样位数是16bit。由于1Byte=8bit,所以一个声道的一个采样值占用2Byte。“LE”代表Little Endian,代表2 Byte采样值的存储方式为高位存在高地址中。
  ② WAVE格式音频(扩展名为“.wav”)是Windows系统中最常见的一种音频。该格式的实质就是在PCM文件的前面加了一个文件头。可以通过在PCM文件前面加一个WAVE文件头从而封装为WAVE格式音频。
  WAVE文件是一种RIFF格式的文件。其基本块名称是“WAVE”,其中包含了两个子块“fmt”和“data”。从编程的角度简单说来就是由WAVE_HEADER、WAVE_FMT、WAVE_DATA、采样数据共4个部分组成。它的结构如下所示。

WAVE_HEADER
WAVE_FMT
WAVE_DATA
PCM数据

  其中前3部分的结构如下所示。在写入WAVE文件头的时候给其中的每个字段赋上合适的值就可以了。但是有一点需要注意:WAVE_HEADER和WAVE_DATA中包含了一个文件长度信息的dwSize字段,该字段的值必须在写入完音频采样数据之后才能获得。因此这两个结构体最后才写入WAVE文件中。

typedef struct WAVE_HEADER{
    char fccID[4];
    unsigned long dwSize;
    char fccType[4];
}WAVE_HEADER;

typedef struct WAVE_FMT{
    char  fccID[4];
    unsigned long dwSize;
    unsigned short wFormatTag;
    unsigned short wChannels;
    unsigned long dwSamplesPerSec;
    unsigned long dwAvgBytesPerSec;
    unsigned short wBlockAlign;
    unsigned short uiBitsPerSample;
}WAVE_FMT;

typedef struct WAVE_DATA{
    char       fccID[4];
    unsigned long dwSize;
}WAVE_DATA;

你可能感兴趣的:(音视频基础)