【数据压缩】WAV文件格式

来源:互联网 发布:怎样加入网络直销 编辑:程序博客网 时间:2024/06/09 19:48

WAV文件是RIFF(Resource Interchange File Format)的一种实例.

这是WAV文件的最顶级的定义:



开始是一个Format Chunk,解释了下列数据的格式,包括了一些采样编码、每通道几位比特、几通道及采样率的信息。

接下来是可选的Fact Chunk,关于一些压缩编码的样本数目。然后是cue point chunk定义了一些重要的样本数目。

playlist chunk,允许样本无序或者重复播放,而不仅是从头到尾。associated data list允许标签和注释被连接到提示点。

最后有个wave data chunk包含了实际的样本。要注意wav文件定义中并没有INFO chunk和CSET chunk的位置。

WAV规范不仅允许一个单一的,连续的,数组的音频样本,也允许按顺序播放的离散块的样本和安静。大多数WAV文件使用单一数组的数据。


对于RIFF WAVE Chunk

 ==================================

    |       |所占字节数|  具体内容   |

    ==================================

    | ID    |  4 Bytes |   'RIFF'    |

    ----------------------------------

    | Size  |  4 Bytes |             |

    ----------------------------------

    | Type  |  4 Bytes |   'WAVE'    |

    ----------------------------------

    以'FIFF'作为标示,然后紧跟着为size字段,该size是整个wav文件大小减去ID

和Size所占用的字节数,即FileLen - 8 = Size。然后是Type字段,为'WAVE',表

示是wav文件。

    结构定义如下:

 struct RIFF_HEADER {  char szRiffID[4];  // 'R','I','F','F'  DWORD dwRiffSize;  char szRiffFormat[4]; // 'W','A','V','E' };

Format Chunk

    ====================================================================

    |               |   字节数  |              具体内容                |

    ====================================================================

    | ID            |  4 Bytes  |   'fmt '                             |

    --------------------------------------------------------------------

    | Size          |  4 Bytes  | 数值为16或18,18则最后又附加信息     |

    --------------------------------------------------------------------  ----

    | FormatTag     |  2 Bytes  | 编码方式,一般为0x0001               |     |

    --------------------------------------------------------------------     |

    | Channels      |  2 Bytes  | 声道数目,1--单声道;2--双声道       |     |

    --------------------------------------------------------------------     |

    | SamplesPerSec |  4 Bytes  | 采样频率                             |     |

    --------------------------------------------------------------------     |

    | AvgBytesPerSec|  4 Bytes  | 每秒所需字节数                       |     |===> WAVE_FORMAT

    --------------------------------------------------------------------     |

    | BlockAlign    |  2 Bytes  | 数据块对齐单位(每个采样需要的字节数) |     |

    --------------------------------------------------------------------     |

    | BitsPerSample |  2 Bytes  | 每个采样需要的bit数                  |     |

    --------------------------------------------------------------------     |

    |               |  2 Bytes  | 附加信息(可选,通过Size来判断有无) |     |

    --------------------------------------------------------------------  ----

            以'fmt '作为标示。一般情况下Size为16,此时最后附加信息没有;如果为18

则最后多了2个字节的附加信息。主要由一些软件制成的wav格式中含有该2个字节的

附加信息。

    结构定义如下:

 struct WAVE_FORMAT {  WORD wFormatTag;  WORD wChannels;  DWORD dwSamplesPerSec;  DWORD dwAvgBytesPerSec;  WORD wBlockAlign;  WORD wBitsPerSample; }; struct FMT_BLOCK {  char  szFmtID[4]; // 'f','m','t',' '  DWORD  dwFmtSize;  WAVE_FORMAT wavFormat; };

Fact Chunk

    ==================================

    |       |所占字节数|  具体内容   |

    ==================================

    | ID    |  4 Bytes |   'fact'    |

    ----------------------------------

    | Size  |  4 Bytes |   数值为4   |

    ----------------------------------

    | data  |  4 Bytes |             |

    ----------------------------------

    Fact Chunk是可选字段,一般当wav文件由某些软件转化而成,则包含该Chunk。

    结构定义如下:


 struct FACT_BLOCK {  char  szFactID[4]; // 'f','a','c','t'  DWORD  dwFactSize; };

Data Chunk

    ==================================

    |       |所占字节数|  具体内容   |

    ==================================

    | ID    |  4 Bytes |   'data'    |

    ----------------------------------

    | Size  |  4 Bytes |             |

    ----------------------------------

    | data  |          |             |

    ----------------------------------

    Data Chunk是真正保存wav数据的地方,以'data'作为该Chunk的标示。然后是

数据的大小。紧接着就是wav数据。根据Format Chunk中的声道数以及采样bit数,

wav数据的bit位置可以分成以下几种形式:

    ---------------------------------------------------------------------

    |   单声道  |    取样1    |    取样2    |    取样3    |    取样4    |

    |           |--------------------------------------------------------

    |  8bit量化 |    声道0    |    声道0    |    声道0    |    声道0    |

    ---------------------------------------------------------------------

    |   双声道  |          取样1            |           取样2           |

    |           |--------------------------------------------------------

    |  8bit量化 |  声道0(左)  |  声道1(右)  |  声道0(左)  |  声道1(右)  |

    ---------------------------------------------------------------------

    |           |          取样1            |           取样2           |

    |   单声道  |--------------------------------------------------------

    | 16bit量化 |    声道0    |  声道0      |    声道0    |  声道0      |

    |           | (低位字节)  | (高位字节)  | (低位字节)  | (高位字节)  |

    ---------------------------------------------------------------------

    |           |                         取样1                         |

    |   双声道  |--------------------------------------------------------

    | 16bit量化 |  声道0(左)  |  声道0(左)  |  声道1(右)  |  声道1(右)  |

    |           | (低位字节)  | (高位字节)  | (低位字节)  | (高位字节)  |

    ---------------------------------------------------------------------

    Data Chunk头结构定义如下:

struct DATA_BLOCK {  char szDataID[4]; // 'd','a','t','a'  DWORD dwDataSize; };

举个例子看一下。英文部分有不同但是意思是一致的。


需要回答的问题:

(1)8bit和16bit样值的二进制编码表示一样吗?

声音采样的编码位数,也是记录每次采样值使用的二位制编码位数,处理声音的分辨率,单位bit.数值越大,分辨率越高,录制和回放声音就越真实.是一个客观反映数字声音信号精度的参数.如8bit等于2的8次方,也就是256,是无符号的,0-255.16bit等于2的16次方,也就是65536,但16bit是有符号的补码,从-32768 to 32767.


(2)现有的wav支持哪几种音频压缩方法?

Code      Description 
0 (0x0000)       Unknown 
1 (0x0001)       PCM/uncompressed (Pulse Code Modulation),脉码调制信号。是模拟音频信号经模数转换(A/D变换)直接形成的二进制序列,该文件没有附加的文件头和文件结束标志。Windows的Convert工具可以把PCM音频格式的文件转换成Microsoft的WAV格式的文件。
2 (0x0002)       Microsoft ADPCM( Adaptive Differential Pulse Code Modulation),自适应差分脉码调制信号。是一种数据压缩算法,该算法利用了语音信号样点间的相关性,并针对语音信号的非平稳特点,使用了自适应预测和自适应量化。
6 (0x0006)       ITU G.711 a-law (a-law algorithm),主要运用于欧洲和世界其他地区。其中,a-law是特别设计用来方便计算机处理的
7 (0x0007)       ITU G.711 µ-law 主要运用于北美和日本,电话音频压缩
17 (0x0011)     IMA ADPCM 该算法中对量化步长的调整使用了简单的查表方法,对于一个输入的PCM值X(n),将其与前一时刻的X(n-1)预测值做差值得到d(n),然后根据当前的量化步长对d(n)进行编码,再用此sample点的编码值调整量化步长,同时还要得到当前sample点的预测值供下一sample点编码使用。
20 (0x0016)     ITU G.723 ADPCM (Yamaha) G.723是ITU在1996年制订成型的一种多媒体语音编解码标准。其典型应用包括VoIP服务、H.324视频电话、无线电话、数字卫星系统、数电倍增设备(DCME)、公共交换电话网(PSTN)、ISDN及各种多媒体语音信息产品。
49 (0x0031)     GSM 6.10 是我们熟知的全球移动通讯系统(Global System for Mobile communications)定义的一种音频编解码标准。广泛应用于无线通信设备如手机、无线通讯终端中。
64 (0x0040)     ITU G.721 ADPCM G.721是ITU-T定义的一组标准协议组G.7xx其中之一,指的是32kbit/s的自适应差分脉冲编码调制(ADPCM)。
80 (0x0050)     MPEG MPEG标准的视频压缩编码技术主要利用了具有运动补偿的帧间压缩编码技术以减小时间冗余度,利用DCT技术以减小图像的空间冗余度,利用熵编码则在信息表示方面减小了统计冗余度。这几种技术的综合运用,大大增强了压缩性能。
65,536 (0xFFFF)  Experimental称为实验性音频。专门用来作音频信号处理的研究开发工作,主要包括优化压缩算法提高压缩效率的工作。这种类型的压缩码流基本不被主流解码器支持,只在一些音频专家和发烧友的实验室里能够流畅的播放出来。



0 0
原创粉丝点击