WAVE PCM 文件剖析

写下此贴,便于以后回顾!


WAVE是录音时用的标准的WINDOWS文件格式,文件的扩展名为“WAV”,数据本身的格式为PCM或压缩型,属于无损音乐格式的一种。符合 RIFF(Resource Interchange File Format)规范。所有的WAV都有一个文件头,这个文件头音频流的编码参数。数据块的记录方式是little-endian字节顺序,标志符并不是字符串而是单独的符号。

【公式】

WAV文件所占容量 =(采样频率×时间×声道)×采样位数/8(1字节=8bit)

       = ( nSamplesPerSec * t * nChannels ) * wBitsPerSample / 8

WAV文件播放时间 = 数据大小 / 每秒播放字节数

     t = dwDataSize / nAvgBytesperSec

nAvgBytesPerSec = nChannels * nSamplesPerSec * wBitsPerSample / 8



WAV PCM文件,只是在PCM(脉冲编码调制)数据基础上加了个 46字节的文件头,分别对应WAVEHEADINFO结构体各成员, 整个文件由文件头+Data组成,Data主要存储的数据为采样值,即Cool Edit pro工具波形图中的Y(smpl)值;



【相关头定义】
#define BUFSIZE 4
#pragma pack(push) //保存对齐状态
#pragma pack(1) //设定为1字节对齐
//WAVEFORMAT结构定义如下: 
struct WAVEFORMAT
{
WORD wFormatag;        //编码格式,包括WAVE_FORMAT_PCM,WAVEFORMAT_ADPCM等     
WORD nChannls;             //声道数,单声道为1,双声道为2;      
DWORD nSamplesPerSec;    //采样频率;      
DWORD nAvgBytesperSec;  //每秒的数据量;       
WORD nBlockAlign;        //块对齐;   
};

struct PCMWAVEFORMAT
{       
WAVEFORMAT wf;//波形格式;      
WORD wBitsPerSample;    //WAVE文件的采样大小; 
}; 

struct FMT_BLOCK
{
char szFmtTag[BUFSIZE];// "RIFF"
DWORD dwDataSize;
char szFormatType[BUFSIZE];// "WAVE"
char szFmtID[BUFSIZE];// 'f','m','t',' '   
DWORD   dwFmtSize;   
PCMWAVEFORMAT wavFormat;
WORD   dwOther; // 2字节额外补充信息
};

// Data Chunk头结构定义如下:
struct DATA_BLOCK
{
char szDataID[BUFSIZE];// 'd','a','t','a'   
DWORD dwDataSize;
};

struct WAVEHEADINFO
{
FMT_BLOCK fmtBlock;
DATA_BLOCK dataBlock;
};
#pragma pack(pop)//恢复对齐状态

 

 

【参考资料】

1.http://blog.csdn.net/lezhiyong/article/details/7899436

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值