剖析 WAVE是錄音時用的標準的
WINDOWS 檔案格式,檔案的擴展名為“WAV”,數據本身的格式為PCM或壓縮型,屬於無損音樂格式的一種。
Wav File 符合 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),若為00000012H則說明數據頭攜帶附加信息(見“附加信息”)。
14H~15H
2
整數
格式種類(值為1時,表示數據為線性PCM編碼)
16H~17H
2
整數
通道數,單聲道為1,雙聲道為2
18H~1BH
4
長整數
採樣頻率
1CH~1FH
4
長整數
波形數據傳輸速率(每秒平均位元組數)
20H~21H
2
整數
DATA數據塊長度,位元組。
22H~23H
2
整數
PCM位寬
隨後 2位元組
2
整數
附加信息(可選,由上方過濾位元組確定)
隨後
...
不定長度字元
“fact”,該部分是可選部分,一般當WAV檔案是由某些軟體轉換而來時,包含該部分。 若包含該部分: (1)該部分的前4位元組為數據頭,一般為4個字母。 (2)隨後4個位元組表示長度,即除去頭(4位元組)和長度(4位元組)之後,數據本身的長度。 (3)最後的位元組為數據本身。 例如:“66 61 73 74 04 00 00 00F8 2F 14 00” 。 “66 61 73 74”是fact欄位的數據頭,“04 00 00 00”是數據本身的長度,“F8 2F 14 00”是數據本身。 (注意是little-endian位元組順序)
隨後 4位元組
4
4字元
數據標誌符(data)
隨後 4位元組
4
長整型
DATA總數據長度位元組
隨後
...
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
Wav File .檔案長度 = UBound(數據) * 2 - 8 + 58 'integer =2bytes
.檔案標誌 = "WAVE"
.波形檔案標誌 = "fmt "
.塊長度 = &H16 '16 or 12?
.格式種類 = 1
.聲道數 = 聲道數 '0 = 單聲道, 1 = 立體聲 '2
.傳送速率 = .採樣率 * 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
圖1 | 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檔案。
圖2 結構定義如下:
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個位元組的
圖3 附加信息。
結構定義如下:
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
圖4 {
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;
};
特點 WAV音頻格式的優點包括:簡單的編/解碼(幾乎直接存儲來自模/數
轉換器 (ADC)的信號)、普遍的認同/支持以及無損耗存儲。WAV格式的主要缺點是需要
音頻 存儲空間。對於小的存儲限制或小頻寬套用而言,這可能是一個重要的問題。WAV格式的另外一個潛在缺陷是在32位WAV檔案中的2G限制,這種限制已在為SoundForge開發的W64格式中得到了改善。
Wav 常見的WAV檔案使用PCM無壓縮編碼,這使WAV檔案的質量極高,體積也出奇大,對於PCM WAV,恐怕也只有
無損壓縮 的
音頻 才能和其有相同的質量,平時我們見的什麼mp3,
wma (不含
wmalossless )和wav的質量都是差很遠的!這點可以通過頻譜看出,即使320kbps的mp3和wav一比,也要自卑了!
支持 Wav格式支持MSADPCM、CCITTALaw、CCITT μ Law和其它壓縮算法,支持多種
音頻 位數、採樣頻率和聲道,但其缺點是檔案體積較大(一分鐘44kHZ、16bit Stereo的WAV檔案約要占用10MB左右的硬碟空間),所以不適合長時間記錄。
在Windows中,把聲音檔案存儲到硬碟上的擴展名為WAV。WAV記錄的是聲音的本身,所以它占的硬碟空間大的很。例如:16位的44.1KHZ的
立體聲 聲音一分鐘要占用大約10MB的容量,和MIDI相比就差的很遠。
轉換 AVI 和WAV在檔案結構上是非常相似的,不過AVI多了一個
視頻流 而已。我們接觸到的AVI有很多種,因此我們經常需要安裝一些Decode才能觀看一些AVI,我們接觸到比較多的DivX就是一種
視頻編碼 ,AVI可以採用DivX編碼來壓縮視頻流,當然也可以使用其他的編碼壓縮。同樣,WAV也可以使用多種
音頻編碼 來壓縮其
音頻流 ,不過我們常見的都是音頻流被PCM編碼處理的WAV,但這不表示WAV只能使用PCM編碼,MP3編碼同樣也可以運用在WAV中,和AVI一樣,只要安裝好了相應的dDecode,就可以欣賞這些WAV了。
Zen Wav播放器 在Windows平台下,基於PCM編碼的WAV是被支持得最好的音頻格式,所有音頻軟體都能完美支持,由於本身可以達到較高的
音質 的要求,因此,WAV也是音樂編輯創作的首選格式,適合保存音樂素材。因此,基於PCM編碼的WAV被作為了一種中介的格式,常常使用在其他編碼的相互轉換之中,例如MP3轉換成WMA。
編解碼器 WAV檔案格式是一種由微軟和IBM聯合開發的用於
音頻 數字存儲的標準,它採用RIFF檔案格式結構,非常接近於AIFF和IFF格式。多媒體套用中使用了多種數據,包括點陣圖、音頻數據、視頻數據以及外圍設備控制信息等。RIFF為存儲這些類型的數據提供了一種方法,RIFF檔案所包含的數據類型由該檔案的擴展名來標識,能以RIFF檔案存儲的數據包括:
# 波形格式數據(.WAV)
# 點陣圖格式數據(.RDI)
# MIDI格式數據(.RMI)
#多媒體電影(.RMN)
# 動畫游標(.ANI)
# 其它RIFF檔案(.BND)
RIFF是一種含有嵌套數據結構的
二進制 檔案格式,每個數據結構都稱為因一個chunk(塊)。Chunk在RIFF檔案中沒有固定的位置,因而
偏移量 不能用於定位域值。一個塊中的數據包括數據結構、數據流或其它組塊(稱為子塊)等,每個RIFF塊都具有如下結構:
typedef struct _Chunk{
VB中播放WAV檔案的VB界面 DWORD ChunkId; /*塊標誌*/
DWORD ChunkSize; /*塊大小*/
BYTE ChunkData[ChunkSize]; /*塊內容*/
} CHUNK;
ChunkId由4個ASCII字元組成,用以識別塊中所包含的數據。字元RIFF用於標識RIFF
數據塊 ,間隔空格在右面是不超過4個字元的ID。由於這種檔案結構最初是由Microsoft和IBM為PC機所定義,RIFF檔案是按照little-endian
位元組順序 寫入的,而採用big-endian位元組順序的檔案則用‘RIFX’作為標誌。
ChunkSize(塊大小)是存儲在ChunkData域
中數據 的長度,ChunkId與ChunkSize域的大小則不包括在該值內。
ChunkData(塊內容)中所包含的數據是以字(WORD)為單位排列的,如果數據長度是奇數,則在最後添加一個空(NULL)
位元組 。
子塊(Subchunk)與塊具有相同的結構。一個子塊就是包含在其它塊內部的一個塊,只有RIFF檔案塊‘RIFF’和列表塊‘List’才能含有子塊,所有其它塊僅能含有數據。一個RIFF檔案就是一個RIFF塊,檔案中所有其它塊和子塊均包含在這個塊中。
脈衝編碼調製 Claude E. Shannon於1948年發表的“通信的數學理論”奠定了現代通信的基礎。同年貝爾實驗室的
工程人員 開發了PCM技術,雖然在當時是革命性的,但今天脈衝編碼調製被視為是一種非常單純的無損耗編碼格式,
音頻 在固定間隔內進行採集並量化為頻帶值,其它採用這種編碼方法的套用包括電話和CD。PCM主要有三種方式:標準PCM、
差分脈衝編碼調製 (DPCM)和自適應DPCM。在標準PCM中,頻帶被量化為線性步長的頻帶,用於存儲絕對量值。在DPCM中存儲的是前後電流值之差,因而
存儲量 減少了約25%。自適應DPCM改變了DPCM的量化步長,在給定的信噪比(SNR)下可壓縮更多的信息。
執行過程 在對WAV
音頻 檔案進行編解碼過程中,最一致的地方包括
採樣點 和採樣幀的處理和轉換。一個採樣點的值代表了給定時間內的
音頻信號 ,一個採樣幀由適當數量的採樣點組成並能構成音頻信號的多個通道。對於
立體聲 信號一個採樣幀有兩個採樣點,一個採樣點對應一個聲道。一個採樣幀作為單一的單元傳送到數/模
轉換器 (DAC),以確保正確的信號能同時傳送到各自的通道中。
VB中WAV 綜述
在多媒體軟體的開發設計中,聲音是一個相當重要的
多媒體元素 ,優秀的
聲音設計 會為多媒體軟體增色不少。而WAV格式的聲音檔案是一種最常用的聲音檔案格式,也最容易得到,比如通過Win 95中的“錄音機”程式,利用麥克風就可以非常簡單地錄製WAV檔案。VB是一個相當經典的多媒體開發的工具,在VB中播放WAV檔案的方法主要有這樣幾種。
OLE控制項
建一
窗體 ,用滑鼠選擇OLE控制項,在窗體上拖出OLE區域,在圖一的視窗中選擇新建和聲音然後按確定鍵就完成了在視窗中添加OLE控制項。
這樣就可以在OLE控制項的ResourceDoc屬性中選擇所要播放的檔案,程式運行時雙擊OLE控制項即可。
在實際的程式設計當中,往往需要單擊某個圖示或按鈕來控制聲音的播放,其實現方法是這樣的:首先將OLE控制項的VISIBLE屬性設定為FALSE,然後在圖示或按鈕的單擊事件中編寫如下的程式:
Private Sub Contol_Click()
OLE1.Action = 7
End Sub
MMControl控制項
VB5.0提供了許多設計多媒體的控制項,在PROJECT/COMPENENTS/CONTROLS中選擇MMControls 控制項,窗體上就出現了多媒體控制項對象,在這個對象上有不同的圖形功能標識,其名稱從左到右分別是Pre、Next、Play、Pause、Back、Step、Stop、Record 、Eject。
這個多媒體控制項可以播放多種格式的聲音,播放WAV格式聲音檔案的程式代碼
Private Sub form_load()
MMControl1.DeviceType = "waveaudio"
MMControl1.filename = "c:\win95\media\ding.wav"
MMControl1.Command = "open"
End Sub '以下是為圖形標識Play事件編寫的代碼
Private Sub MMControl_playclick(cancel As Integer)
MMControl1.Command = "play"
End Sub
當運行這個程式時,MMControl控制項中的Play鍵被激活,點取此按鈕即可播放ding.wav檔案。
在實際的軟體設計當中,更多的情況是滑鼠點擊按鈕或圖示來控制聲音的播放,其實現方法是這樣的:首先將MMControl控制項的VISIBLE屬性設定為FALSE,然後在圖示或按鈕的單擊事件中編寫如下的程式:
Private Sub Control1_Click()
MMControl1.Command = "play"
End Sub
運行程式時單擊相用的按鈕或圖示,WAV檔案照樣可以播放。用自行設計的按鈕或圖示取代多媒體控制項中的固定按鈕,可設計出更加靈活方便的用戶界面。
VB的API函式
在窗體的DECLARATIONS(聲明)中輸入如下代碼:
P rivate Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal_lpszSoundName As String,ByVal uFlags As Long) As Long
'lpszSoundName是一個字元串變數,表示一個WAV格式的檔案名稱。
'uFlags 用於設定播放狀態的各種選項。
參數值 為0X00時,實現同步播放,參數值為0X01時實現非同步播放。
在命令按鈕的單擊事件中輸入如下代碼:
Private Sub Command1_Click()
Dim plays As Long
plays = sndPlaySound(“E:\WINDOWS\MEDIA\DING.WAV",&H0)
End Sub
運行時單擊命令按鈕即可播放WAV檔案。