Wave檔案格式

來源:互聯網
上載者:User
一、綜述
    WAVE檔案作為多媒體中使用的聲波檔案格式之一,它是以RIFF格式為標準的。
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 C
hunk                     |
|             ID = 'fmt '                      |
------------------------------------------------
|             Fact Chunk(optional)             |
|             ID = 'fact'                      |
------------------------------------------------
|             Data Chunk                       |
|             ID = 'data'                      |
------------------------------------------------
            圖1   Wav格式包含Chunk樣本
    其中除了Fact Chunk外,其他三個Chunk是必須的。每個Chunk有各自的ID,位
於Chunk最開始位置,作為標示,而且均為4個位元組。並且緊跟在ID後面的是Chunk大
小(去除ID和Size所佔的位元組數後剩下的其他位元組數目),4個位元組表示,低位元組
表示數值低位,高位元組表示數值高位。下面具體介紹各個Chunk內容。
PS:
    所有數值表示均為低位元組表示低位,高位元組表示高位。
二、具體介紹
RIFF WAVE Chunk
    ==================================
    |       |所佔位元組數|  具體內容   |
    ==================================
    | ID    |  4 Bytes |   'RIFF'    |
    ----------------------------------
    | Size  |  4 Bytes |             |
    ----------------------------------
    | Type  |  4 Bytes |   'WAVE'    |
    ----------------------------------
            圖2  RIFF WAVE Chunk
    以'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來判斷有無) |     |
    --------------------------------------------------------------------  ----
                            圖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位置可以分成以下幾種形式:
    ---------------------------------------------------------------------
    |   單聲道  |    取樣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檔案讀取到指定數組中.已知wav檔案16位 單聲道.
void read_wave(char *str)
{
    int fd,len,k,data_size;
    unsigned char a[44];
    unsigned char b[8000];
    fd=open(str,O_RDONLY);
    len=read(fd,a,44);
    data_size=(((unsigned int)(a[7]))<<24)+(((unsigned int)(a[6]))<<16)+((unsigned int)(a[4]))+(((unsigned int)(a[4])<<8));
    len=read(fd,b,8000);
    close(fd);
    for(k=0;k<4400;k++)
    t[k]=(((unsigned short)(b[2*k]))+(((unsigned short)(b[2*k+1]))<<8)+32768);
    for(k=0;k<4400;k++)
    t[k]=((int)(((int)(t[k]))*400))/65535;
}
                
                
               

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.