- 相關(guān)推薦
WAV
WAV
WAV(WAV)
WAV為微軟公司(Microsoft)開發(fā)的一種聲音文件格式,它符合RIFF(Resource Interchange File Format)文件規(guī)范,用于保存Windows平臺的音頻信息資源,被Windows平臺及其應(yīng)用程序所廣泛支持,該格式也支持MSADPCM,CCITT A LAW等多種壓縮運(yùn)算法,支持多種音頻數(shù)字,取樣頻率和聲道,標(biāo)準(zhǔn)格式化的WAV文件和CD格式一樣,也是44.1K的取樣頻率,16位量化數(shù)字,因此在聲音文件質(zhì)量和CD相差無幾! WAV打開工具是WINDOWS的媒體播放器。
目錄 簡介 剖析 聲道 音頻 收縮展開 簡介通常使用三個參數(shù)來表示聲音,量化位數(shù),取樣頻率和采樣點(diǎn)振幅。量化位數(shù)分為8位,16位,24位三種,聲道有單聲道和立體聲之分,單聲道振幅數(shù)據(jù)為n*1矩陣點(diǎn),立體聲為n*2矩陣點(diǎn),取樣頻率一般有11025Hz(11kHz) ,22050Hz(22kHz)和44100Hz(44kHz) 三種,不過盡管音質(zhì)出色,但在壓縮后的文件體積過大!相對其他音頻格式而言是一個缺點(diǎn),其文件大小的計(jì)算方式為:WAV格式文件所占容量(B) = (取樣頻率 X量化位數(shù)X 聲道) X 時間 / 8 (字節(jié)= 8bit) 每一分鐘WAV格式的音頻文件的大小為10MB,其大小不隨音量大小及清晰度的變化而變化。 支持WAV設(shè)計(jì)的手機(jī)主要為智能手機(jī),如索尼愛立信P910和諾基亞N90以及采用微軟OS的多普達(dá)等手機(jī),而其它一些非智能手機(jī)的產(chǎn)品,如果宣傳支持WAV格式則多半屬于只是支持單聲道的。
剖析WAVE是錄音時用的標(biāo)準(zhǔn)的WINDOWS文件格式,文件的擴(kuò)展名為“WAV”,數(shù)據(jù)本身的格式為PCM或壓縮型,屬于無損音樂格式的一種。 符合 RIFF(Resource Interchange File Format)規(guī)范。所有的WAV都有一個文件頭,這個文件頭音頻流的編碼參數(shù)。數(shù)據(jù)塊的記錄方式是little-endian字節(jié)順序,標(biāo)志符并不是字符串而是單獨(dú)的符號。 表1 WAV文件的文件頭 , 偏移地址 大小 字節(jié) 數(shù)據(jù)塊 類型 內(nèi)容 00H~03H 4 4字符 資源交換文件標(biāo)志(RIFF) 04H~07H 4 長整數(shù) 從下個地址開始到文件尾的總字節(jié)數(shù) 08H~0BH 4 4字符 WAV文件標(biāo)志(WAVE) 0CH~0FH 4 4字符 波形格式標(biāo)志(fmt ),最后一位空格。 10H~13H 4 整數(shù) 過濾字節(jié)(一般為00000010H) 14H~15H 2 整數(shù) 格式種類(值為1時,表示數(shù)據(jù)為線性PCM編碼) 16H~17H 2 整數(shù) 通道數(shù),單聲道為1,雙聲道為2 18H~1BH 4 長整數(shù) 采樣頻率 1CH~1FH 4 長整數(shù) 波形數(shù)據(jù)傳輸速率(每秒平均字節(jié)數(shù)) 20H~21H 2 整數(shù) DATA數(shù)據(jù)塊長度,字節(jié)! 22H~23H 2 整數(shù) PCM位寬 24H~27H44字符“fact”,該部分一下是可選部分,即可能有,可能沒有,一般到WAV文件由某些軟件轉(zhuǎn)換而成時,包含這部分。 28H~2BH4長整數(shù) size,數(shù)值為4表2 WAV聲音文件的數(shù)據(jù)塊 偏移地址 字節(jié)數(shù) 類型 內(nèi)容 24H~27H 4 4字符 數(shù)據(jù)標(biāo)志符(data) 28H~2BH 4 長整型 DATA總數(shù)據(jù)長度字節(jié) 2CH... ... DATA數(shù)據(jù)塊 WAV文件作為最經(jīng)典的Windows多媒體音頻格式,應(yīng)用非常廣泛,它使用三個參數(shù)來表示聲音:采樣位數(shù)、采樣頻率和聲道數(shù)。 Sub 寫wav文件(文件名 As String, 數(shù)據(jù)() As Integer, Optional 聲道數(shù) As Integer = 1, Optional 采樣率 As Long = 44100) 文件名 = App.Path + "./sd/" + 文件名 + ".wav" With 新聲音 .RIFF = "RIFF" 'Riff WAVE Chunk .文件長度 = UBound(數(shù)據(jù)) * 2 - 8 + 58 'integer =2bytes .文件標(biāo)志 = "WAVE" .波形文件標(biāo)志 = "fmt " .塊長度 = &H16 '16 or 12? .格式種類 = 1 .聲道數(shù) = 聲道數(shù) '0 = 單聲道, 1 = 立體聲 '2 .采樣率 = 采樣率 '4 .傳送速率 = .采樣率 * 2 * .聲道數(shù) '4 每秒所需字節(jié)數(shù) .DATA數(shù)據(jù)塊長度 = 2 * .聲道數(shù) '2 每個采樣所需字節(jié)數(shù) .PCM位寬 = 16 '16位 .m_ = "fact" '4 factchunk .n = 4 '4 4 .o = 0 '150912? factchunk.data .數(shù)據(jù)標(biāo)識符 = "data" .DATA總數(shù)據(jù)長度 = UBound(數(shù)據(jù)) * 2 ' .DATA數(shù)據(jù)塊 = 數(shù)據(jù) End With Dim fr: fr = FreeFile() Open 文件名 For Binary As #fr: Put #fr, , 新聲音: Close #fr End Sub
聲道聲道有單聲道和立體聲之分,采樣頻率一般有11025Hz(11kHz)、22050Hz(22kHz)和44100Hz(44kHz)三種。WAV文件所占容量=(采樣頻率×采樣位數(shù)×聲道)×?xí)r間/8(1字節(jié)=8bit)。 WAV對音頻流的編碼沒有硬性規(guī)定,除了PCM之外,還有幾乎所有支持ACM規(guī)范的編碼都可以為WAV的音頻流進(jìn)行編碼。
音頻音頻視頻交錯格式數(shù)據(jù)(.AVI) 、波形格式數(shù)據(jù)(.WAV) 、位圖格式數(shù)據(jù)(.RDI) 、MIDI格式數(shù)據(jù)(.RMI) 、調(diào)色板格式(.PAL) 、多媒體電影(.RMN) 、動畫光標(biāo)(.ANI) 、其它RIFF文件(.BND)。 WAVE文件可以存儲大量格式的。 RIFF是英文Resource Interchange File Format的縮寫,每個WAVE文件的頭四個字節(jié)便是“RIFF”。WAVE文件由文件頭和數(shù)據(jù)體兩大部分組成。其中文件頭又分為RIFF/WAV文件標(biāo)識段和聲音數(shù)據(jù)格式說明段兩部分。WAVE文件各部分內(nèi)容及格式見附表。 常見的聲音文件主要有兩種,分別對應(yīng)于單聲道(11.025KHz采樣率、8Bit的采樣值)和雙聲道(44.1KHz采樣率、16Bit的采樣值)。采樣率是指:聲音信號在“模→數(shù)”轉(zhuǎn)換過程中單位時間內(nèi)采樣的次數(shù)。采樣值是指每一次采樣周期內(nèi)聲音模擬信號的積分值。 對于單聲道聲音文件,采樣數(shù)據(jù)為八位的短整數(shù)(short int 00H-FFH);而對于雙聲道立體聲聲音文件,每次采樣數(shù)據(jù)為一個16位的整數(shù)(int),高八位和低八位分別代表左右兩個聲道。 WAVE文件數(shù)據(jù)塊包含以脈沖編碼調(diào)制(PCM)格式表示的樣本。WAVE文件是由樣本組織而成的。在單聲道WAVE文件中,聲道0代表左聲道,聲道1代表右聲道。在多聲道WAVE文件中,樣本是交替出現(xiàn)的。 WAVE文件的每個樣本值包含在一個整數(shù)i中,i的長度為容納指定樣本長度所需的最小字節(jié)數(shù)。首先存儲低有效字節(jié),表示樣本幅度的位放在i的高有效位上,剩下的位置為0,這樣8位和16位的PCM波形樣本的數(shù)據(jù)格式。 RIFF是英文Resource Interchange File Format的縮寫,每個WAVE文件的頭四個 字節(jié)便是“RIFF”。 WAVE文件是由若干個Chunk組成的.。按照在文件中的出現(xiàn)位置包括: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 | |所占字節(jié)數(shù)| 具體內(nèi)容 | | ID | 4 Bytes | 'RIFF' | | Size | 4 Bytes | | | Type | 4 Bytes | 'WAVE' | 圖2 RIFF WAVE Chunk 以'RIFF'作為標(biāo)示,然后緊跟著為size字段,該size是整個wav文件大小減去ID 和Size所占用的字節(jié)數(shù),即FileLen - 8 = Size。然后是Type字段,為'WAVE',表示是wav文件。 結(jié)構(gòu)定義如下: struct RIFF_HEADER { char szRiffID[4]; // 'R','I','F','F' DWORD dwRiffSize; char szRiffFormat[4]; // 'W','A','V','E' }; Format Chunk | |字節(jié)數(shù) | 具體內(nèi)容 | | ID | 4 Bytes | 'fmt ' | | Size | 4 Bytes |數(shù)值為16或18,18則最后又附加信息 | | FormatTag | 2 Bytes | 編碼方式,一般為0x0001 | | Channels | 2 Bytes |聲道數(shù)目,1--單聲道;2--雙聲道 | | | SamplesPerSec | 4 Bytes | 采樣頻率 | AvgBytesPerSec| 4 Bytes | 每秒所需字節(jié)數(shù) | |===> WAVE_FORMAT | BlockAlign | 2 Bytes |數(shù)據(jù)塊對齊單位(每個采樣需要的字節(jié)數(shù)) | | | BitsPerSample | 2 Bytes | 每個采樣需要的bit數(shù) | | | | 2 Bytes | 附加信息(可選,通過Size來判斷有無) | | 圖3 Format Chunk 以'fmt '作為標(biāo)示。一般情況下Size為16,此時最后附加信息沒有;如果為18則最后多了2個字節(jié)的附加信息。主要由一些軟件制成的wav格式中含有該2個字節(jié)的 附加信息。 結(jié)構(gòu)定義如下: 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 | |所占字節(jié)數(shù)| 具體內(nèi)容 | | ID | 4 Bytes | 'fact' | | Size | 4 Bytes | 數(shù)值為4 | | data | 4 Bytes | | 圖4 Fact Chunk Fact Chunk是可選字段,一般當(dāng)wav文件由某些軟件轉(zhuǎn)化而成,則包含該Chunk。 結(jié)構(gòu)定義如下:struct FACT_BLOCK { char szFactID[4]; // 'f','a','c','t' DWORD dwFactSize; }; Data Chunk | |所占字節(jié)數(shù)| 具體內(nèi)容 | | ID | 4 Bytes | 'data' | | Size | 4 Bytes | | | data | | | 圖5 Data Chunk Data Chunk是真正保存wav數(shù)據(jù)的地方,以'data'作為該Chunk的標(biāo)示。然后是 數(shù)據(jù)的大小。緊接著就是wav數(shù)據(jù)。根據(jù)Format Chunk中的聲道數(shù)以及采樣bit數(shù), wav數(shù)據(jù)的bit位置可以分成以下幾種形式: 對于8位單聲道,每個樣本數(shù)據(jù)由8位(bit)表示; 對于8位立體聲,每個聲道的數(shù)據(jù)由一個8位(bit)數(shù)據(jù)表示,且第一個8位(bit) 數(shù)據(jù)表示0聲道(左)數(shù)據(jù),緊隨其后的8位(bit)數(shù)據(jù)表示1聲道(右)數(shù)據(jù); 對于16位單聲道,每個樣本數(shù)據(jù)由16位(bit)表示;其中低字節(jié)存放高位,高字節(jié)存放低位 對于16位立體聲,每個聲道的數(shù)據(jù)由一個16位(bit)數(shù)據(jù)表示,且第一個16位(bit) 數(shù)據(jù)表示0聲道(左)數(shù)據(jù),緊隨其后的16位(bit)數(shù)據(jù)表示1聲道(右)數(shù)據(jù)。 |單聲道| 取樣1 | 取樣2 | 取樣3 | 取樣4 | | 8bit量化 |聲道0 | 聲道0 | 聲道0 | 聲道0 | | 雙聲道| 取樣1 | 取樣2 | 8bit量化 |聲道0(左) | 聲道1(右) | 聲道0(左) | 聲道1(右) | | | 取樣1 | 取樣2 | |單聲道| | 16bit量化 |聲道0 | 聲道0 | 聲道0 | 聲道0 | | | (低位字節(jié)) | (高位字節(jié)) | (低位字節(jié)) | (高位字節(jié)) | | | 取樣1 | | 雙聲道| | 16bit量化 |聲道0(左) | 聲道0(左) | 聲道1(右) | 聲道1(右) | | | (低位字節(jié)) | (高位字節(jié)) | (低位字節(jié)) | (高位字節(jié)) 圖6 wav數(shù)據(jù)bit位置安排方式Data Chunk頭結(jié)構(gòu)定義如下: struct DATA_BLOCK { char szDataID[4]; // 'd','a','t','a' DWORD dwDataSize; };