PCM(脉冲 +编码+调制)为原始音频数据采集的一种格式,可以只包含负载(payload),也可以包含头信息(header)+负载(payload)。通过arecord得到的PCM文件是包含头信息(header)+负载(payload)的格式。
头信息为44个字节的格式如下:
内容长度“RIFF”4后续字节长度(即文件大小-8)4“WAVE”4“fmt ”4下一结构体变成16位长(10 00 00 00)4PCM标示(01 00)2通道数2采样率(44 AC 00 00 表示 44100Hz)4每秒字节数(采样率x通道数x每个采样点字节数)4每个采样点字节数(04 00 表示双声道16位采样)2量化比特数(10 00表示16比特采样)2“data”4实际负载长度4负载格式如下:
1. 8 Bit 单声道:
采样点1采样点2数据1数据22. 8 Bit 双声道
采样点1 采样点2 声道1数据1声道2数据1声道1数据2声道2数据23. 16 Bit 单声道:
采样点1 采样点2 数据1低字节数据1高字节数据1低字节数据1高字节4. 16 Bit 双声道
采样点1 声道1数据1低字节声道1数据1高字节声道2数据1低字节声道2数据1高字节采样点2 声道1数据2低字节声道1数据2高字节声道2数据2低字节声道2数据2高字节测试代码如下:
#include <iostream> int main() { FILE* fp=fopen("brocast.pcm","rb"); FILE* fpw=fopen("brocastwb.pcm","wb"); for(int i=0;i<11;i++)//读过44个字节的头信息 { unsigned char* buffer=(unsigned char*)malloc(4*8); fread(buffer,4,1,fp); fwrite(buffer,4,1,fpw); // printf("%x %x %x %x\n",buffer[0],buffer[1],buffer[2],buffer[3] ); free(buffer); } for(int i=0;i<600000;i++)//将左声道的数据写到右声道 { unsigned char* buffer=(unsigned char*)malloc(4*8); fread(buffer,4,1,fp); // buffer[0]=0; // buffer[1]=0; // buffer[2] = buffer[2]-abs(buffer[2]-buffer[0]); buffer[0]=buffer[2]; buffer[1]=buffer[3]; fwrite(buffer,4,1,fpw); // printf("%x %x %x %x\n",buffer[0],buffer[1],buffer[2],buffer[3] ); free(buffer); } fflush(fpw); fclose(fp); fclose(fpw); return 0; }功能为:读入brocast.pcm文件,假设是16位采样双声道的音频,将左声道的数据写入右声道,然后保存为brocastwb.pcm文件。