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

PCM(脉冲 +编码+调制)为原始音频数据采集的一种格式,可以只包含负载(payload),也可以包含头信息(header)+负载(payload)。通过arecord得到的PCM文件是包含头信息(header)+负载(payload)的格式。

头信息为44个字节的格式如下:
 

内容长度
“RIFF”4
后续字节长度(即文件大小-8)4
“WAVE”4
“fmt    ”4
下一结构体变成16位长(10 00 00 00)4
PCM标示(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文件。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值