- 相关推荐
WAV
WAV
WAV(WAV)
WAV为微软公司(Microsoft)开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范,用于保存Windows平台的音频信息资源,被Windows平台及其应用程序所广泛支持,该格式也支持MSADPCM,CCITT A LAW等多种压缩运算法,支持多种音频数字,取样频率和声道,标准格式化的WAV文件和CD格式一样,也是44.1K的取样频率,16位量化数字,因此在声音文件质量和CD相差无几! WAV打开工具是WINDOWS的媒体播放器。
目录 简介 剖析 声道 音频 收缩展开 简介通常使用三个参数来表示声音,量化位数,取样频率和采样点振幅。量化位数分为8位,16位,24位三种,声道有单声道和立体声之分,单声道振幅数据为n*1矩阵点,立体声为n*2矩阵点,取样频率一般有11025Hz(11kHz) ,22050Hz(22kHz)和44100Hz(44kHz) 三种,不过尽管音质出色,但在压缩后的文件体积过大!相对其他音频格式而言是一个缺点,其文件大小的计算方式为:WAV格式文件所占容量(B) = (取样频率 X量化位数X 声道) X 时间 / 8 (字节= 8bit) 每一分钟WAV格式的音频文件的大小为10MB,其大小不随音量大小及清晰度的变化而变化。 支持WAV设计的手机主要为智能手机,如索尼爱立信P910和诺基亚N90以及采用微软OS的多普达等手机,而其它一些非智能手机的产品,如果宣传支持WAV格式则多半属于只是支持单声道的。
剖析WAVE是录音时用的标准的WINDOWS文件格式,文件的扩展名为“WAV”,数据本身的格式为PCM或压缩型,属于无损音乐格式的一种。 符合 RIFF(Resource Interchange File Format)规范。所有的WAV都有一个文件头,这个文件头音频流的编码参数。数据块的记录方式是little-endian字节顺序,标志符并不是字符串而是单独的符号。 表1 WAV文件的文件头 , 偏移地址 大小 字节 数据块 类型 内容 00H~03H 4 4字符 资源交换文件标志(RIFF) 04H~07H 4 长整数 从下个地址开始到文件尾的总字节数 08H~0BH 4 4字符 WAV文件标志(WAVE) 0CH~0FH 4 4字符 波形格式标志(fmt ),最后一位空格。 10H~13H 4 整数 过滤字节(一般为00000010H) 14H~15H 2 整数 格式种类(值为1时,表示数据为线性PCM编码) 16H~17H 2 整数 通道数,单声道为1,双声道为2 18H~1BH 4 长整数 采样频率 1CH~1FH 4 长整数 波形数据传输速率(每秒平均字节数) 20H~21H 2 整数 DATA数据块长度,字节。 22H~23H 2 整数 PCM位宽 24H~27H44字符“fact”,该部分一下是可选部分,即可能有,可能没有,一般到WAV文件由某些软件转换而成时,包含这部分。 28H~2BH4长整数 size,数值为4表2 WAV声音文件的数据块 偏移地址 字节数 类型 内容 24H~27H 4 4字符 数据标志符(data) 28H~2BH 4 长整型 DATA总数据长度字节 2CH... ... DATA数据块 WAV文件作为最经典的Windows多媒体音频格式,应用非常广泛,它使用三个参数来表示声音:采样位数、采样频率和声道数。 Sub 写wav文件(文件名 As String, 数据() As Integer, Optional 声道数 As Integer = 1, Optional 采样率 As Long = 44100) 文件名 = App.Path + "./sd/" + 文件名 + ".wav" With 新声音 .RIFF = "RIFF" 'Riff WAVE Chunk .文件长度 = UBound(数据) * 2 - 8 + 58 'integer =2bytes .文件标志 = "WAVE" .波形文件标志 = "fmt " .块长度 = &H16 '16 or 12? .格式种类 = 1 .声道数 = 声道数 '0 = 单声道, 1 = 立体声 '2 .采样率 = 采样率 '4 .传送速率 = .采样率 * 2 * .声道数 '4 每秒所需字节数 .DATA数据块长度 = 2 * .声道数 '2 每个采样所需字节数 .PCM位宽 = 16 '16位 .m_ = "fact" '4 factchunk .n = 4 '4 4 .o = 0 '150912? factchunk.data .数据标识符 = "data" .DATA总数据长度 = UBound(数据) * 2 ' .DATA数据块 = 数据 End With Dim fr: fr = FreeFile() Open 文件名 For Binary As #fr: Put #fr, , 新声音: Close #fr End Sub
声道声道有单声道和立体声之分,采样频率一般有11025Hz(11kHz)、22050Hz(22kHz)和44100Hz(44kHz)三种。WAV文件所占容量=(采样频率×采样位数×声道)×时间/8(1字节=8bit)。 WAV对音频流的编码没有硬性规定,除了PCM之外,还有几乎所有支持ACM规范的编码都可以为WAV的音频流进行编码。
音频音频视频交错格式数据(.AVI) 、波形格式数据(.WAV) 、位图格式数据(.RDI) 、MIDI格式数据(.RMI) 、调色板格式(.PAL) 、多媒体电影(.RMN) 、动画光标(.ANI) 、其它RIFF文件(.BND)。 WAVE文件可以存储大量格式的。 RIFF是英文Resource Interchange File Format的缩写,每个WAVE文件的头四个字节便是“RIFF”。WAVE文件由文件头和数据体两大部分组成。其中文件头又分为RIFF/WAV文件标识段和声音数据格式说明段两部分。WAVE文件各部分内容及格式见附表。 常见的声音文件主要有两种,分别对应于单声道(11.025KHz采样率、8Bit的采样值)和双声道(44.1KHz采样率、16Bit的采样值)。采样率是指:声音信号在“模→数”转换过程中单位时间内采样的次数。采样值是指每一次采样周期内声音模拟信号的积分值。 对于单声道声音文件,采样数据为八位的短整数(short int 00H-FFH);而对于双声道立体声声音文件,每次采样数据为一个16位的整数(int),高八位和低八位分别代表左右两个声道。 WAVE文件数据块包含以脉冲编码调制(PCM)格式表示的样本。WAVE文件是由样本组织而成的。在单声道WAVE文件中,声道0代表左声道,声道1代表右声道。在多声道WAVE文件中,样本是交替出现的。 WAVE文件的每个样本值包含在一个整数i中,i的长度为容纳指定样本长度所需的最小字节数。首先存储低有效字节,表示样本幅度的位放在i的高有效位上,剩下的位置为0,这样8位和16位的PCM波形样本的数据格式。 RIFF是英文Resource Interchange File Format的缩写,每个WAVE文件的头四个 字节便是“RIFF”。 WAVE文件是由若干个Chunk组成的.。按照在文件中的出现位置包括:RIFF WAVE Chunk,Format Chunk,Fact Chunk(可选),Data Chunk。具体见下图: | RIFF WAVE Chunk | | ID = 'RIFF' | | RiffType = 'WAVE' | | Format Chunk | | ID = 'fmt ' | Fact Chunk(optional) | | ID = 'fact' | | Data Chunk | | ID = 'data' | 图1 Wav格式包含Chunk示例 RIFF WAVE Chunk | |所占字节数| 具体内容 | | ID | 4 Bytes | 'RIFF' | | Size | 4 Bytes | | | Type | 4 Bytes | 'WAVE' | 图2 RIFF WAVE Chunk 以'RIFF'作为标示,然后紧跟着为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来判断有无) | | 图3 Format Chunk 以'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 | | 图4 Fact Chunk 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 | | | 图5 Data Chunk Data Chunk是真正保存wav数据的地方,以'data'作为该Chunk的标示。然后是 数据的大小。紧接着就是wav数据。根据Format Chunk中的声道数以及采样bit数, wav数据的bit位置可以分成以下几种形式: 对于8位单声道,每个样本数据由8位(bit)表示; 对于8位立体声,每个声道的数据由一个8位(bit)数据表示,且第一个8位(bit) 数据表示0声道(左)数据,紧随其后的8位(bit)数据表示1声道(右)数据; 对于16位单声道,每个样本数据由16位(bit)表示;其中低字节存放高位,高字节存放低位 对于16位立体声,每个声道的数据由一个16位(bit)数据表示,且第一个16位(bit) 数据表示0声道(左)数据,紧随其后的16位(bit)数据表示1声道(右)数据。 |单声道| 取样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(右) | | | (低位字节) | (高位字节) | (低位字节) | (高位字节) 图6 wav数据bit位置安排方式Data Chunk头结构定义如下: struct DATA_BLOCK { char szDataID[4]; // 'd','a','t','a' DWORD dwDataSize; };