PCM格式分析(头信息+负载)

    xiaoxiao2022-07-07  231

    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数据2

    2. 8 Bit 双声道

    采样点1 采样点2 声道1数据1声道2数据1声道1数据2声道2数据2

    3. 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文件。

     

    最新回复(0)