日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WAV文件格式分析

發布時間:2023/12/10 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WAV文件格式分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

特別說明,本文摘抄于:http://blog.csdn.net/zhihu008/article/details/7854529???? 只做筆記使用,絕無抄襲之意

一. RIFF概念

在Windows環境下,大部分的多媒體文件都依循著一種結構來存放信息,這種結構稱為"資源互換文件格式"(Resources lnterchange File Format),簡稱RIFF。例如聲音的WAV文件、視頻的AV1文件等等均是由此結構衍生出來的。RIFF可以看做是一種樹狀結構,其基本構成單位為chunk,猶如樹狀結構中的節點,每個chunk由"辨別碼"、"數據大小"及"數據"所組成。

塊的標志符(4BYTES)

數據大小 (4BYTES)

數據

?????????????????????????????? 圖一、 塊的結構示意圖

辨別碼由4個ASCII碼所構成,數據大小則標示出緊跟其后數據的長度(單位為Byte),而數據大小本身也用掉4個Byte,所以事實上一個chunk的長度為數據大小加8。一般而言,chunk本身并不允許內部再包含chunk,但有兩種例外,分別為以"RIFF"及"L1ST"為辨別碼的chunk。而針對此兩種chunk,RIFF又從原先的"數據"中切出4個Byte。 此4個Byte稱為"格式辨別碼",然而RIFF又規定文件中僅能有一個以"RIFF"為辨別碼的chunk。

RIFF/LIST標志符

數據1大小

數據1

格式/列表類型

數據

?????????????????????????????? 圖二、RIFF/LIST塊結構

只要依循此一結構的文件,我們均稱之為RIFF檔。此種結構提供了一種系統化的分類。如果和MS一DOS文件系統作比較,"RIFF"chunk就好比是一臺硬盤的根目錄,其格式辨別碼便是此硬盤的邏輯代碼(C:或D:),而"L1ST"chunk即為其下的子目錄,其他的chunk則為一般的文件。至于在RIFF文件的處理方面,微軟提供了相關的函數。視窗下的各種多媒體文件格式就如同在磁盤機下規定僅能放怎樣的目錄,而在該目錄下僅能放何種數據。

二. WAV文件格式

WAVE文件是非常簡單的一種RIFF文件,它的格式類型為"WAVE"。RIFF塊包含兩個子塊,這兩個子塊的ID分別是"fmt"和"data",其中"fmt"子塊由結構PCMWAVEFORMAT所組成,其子塊的大小就是sizeofof(PCMWAVEFORMAT),數據組成就是PCMWAVEFORMAT結構中的數據。

標志符(RIFF)

數據大小

格式類型("WAVE")

"fmt"

Sizeof(PCMWAVEFORMAT)

PCMWAVEFORMAT

"data"

聲音數據大小

聲音數據

圖三、WAVE文件結構

PCMWAVEFORMAT結構定義如下:

Typedefstruct
...{
???  WAVEFORMAT wf;???????
/波形格式;
???  WORD wBitsPerSample;???
//WAVE文件的采樣大小;
} PCMWAVEFORMAT;

//WAVEFORMAT結構定義如下:
typedefstruct
...{
???  WORD wFormatag;???????
//編碼格式,包括WAVE_FORMAT_PCM,WAVEFORMAT_ADPCM等
???  WORD nChannls;???????//聲道數,單聲道為1,雙聲道為2;
???  DWORD nSamplesPerSec;???//采樣頻率;
???  DWORD nAvgBytesperSec;???//每秒的數據量;
????? WORD nBlockAlign;???????//塊對齊;
} WAVEFORMAT;

"data"子塊包含WAVE文件的數字化波形聲音數據,其存放格式依賴于"fmt"子塊中wFormatTag成員指定的格式種類,在多聲道WAVE文件中,樣本是交替出現的。如16bit的單聲道WAVE文件和雙聲道WAVE文件的數據采樣格式分別如圖四所示:

16位單聲道:

采樣一

采樣二

……

低字節

高字節

低字節

高字節

……

16位雙聲道:

采樣一

……

左聲道

右聲道

……

低字節

高字節

低字節

高字節

……

???????????????????????????? 圖四、WAVE文件數據采樣格式

WAV文件格式實例分析:

0?? 1?? 2?? 3?? 4?? 5?? 6?? 7?? 8?? 9?? A?? B?? C?? D?? E?? F

00000000H

00000010H

00000020H

00000030H

00000040H

52? 49? 46? 46? 0A 06? 01? 00? 57? 41? 56? 45? 66? 6D 74? 20

12? 00? 00? 00? 01? 00? 02? 00? 44? AC 00 00? 10? B1? 02? 00

04? 00? 10? 00? 00? 00? 66? 61? 63? 74? 04? 00? 00? 00? 76? 41

00? 00? 64? 61? 74? 61? D8? 05? 01? 00 00? 00? 00? 00? FF? FF

00? 00? FE FF FE FF? 00? 00? 00? 00 FE? FF FE FF? 00? 00

偏移地址

字節數

數據類型

內容

文件頭

00H

4

char

“RIFF”;??RIFF標志

04H

4

long int

0x00 01 06 0A(注意數據存儲順序);??文件長度,這個長度是指”RIFF”;??RIFF標志占的長度,也就是說這個值等于文件的總長度減去RIFF標志占的4個字節和該值占的4個字節

08H

4

char

“WAVE”;??WAVE標志

0CH

4

char

“fmt ”;??fmt標志,最后一位為空

10H

4

long int

?sizeof(PCMWAVEFORMAT)

14H

2

int

1(WAVE_FORMAT_PCM);?格式類別,1表示為PCM形式的聲音數據

16H

2

int

2;?通道數,單聲道為1,雙聲道為2

18H

4

long int

44100;?采樣頻率(每秒樣本數)

1CH

4

long int

0x0002b110;??每秒數據量;其值為通道數×每秒數據位數×每樣本的數據位數/8。播放軟件利用此值可以估計緩沖區的大小。

20H

2

int

數據塊的調整數(按字節算的),其值為通道數×每樣本的數據位值/8。播放軟件需要一次處理多個該值大小的字節數據,以便將其值用于緩沖區的調整。

22H

2

每樣本的數據位數,表示每個聲道中各個樣本的數據位數。如果有多個聲道,對每個聲道而言,樣本大小都一樣。

24H

4

char

“data”;??數據標記符

28H

4

long int

0x00 01 05 D8;??語音數據大小,這個長度是data標識符的所有長度,那么對這里來說該值就是有效數據長度,也即是從“data”; 該值等于 數據標記符的地址(50H)開始到這個標志結束減去標識符占的四個字節和本數值占的四個字節

如下圖左邊是16BIT 16KHZ,左邊是8BIT 8KHZ:

注意:在fmt后面可能有“fact”格式標志:

“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-indian字節順序)

這里我附上我從網上拿到的一些WAV格式的鈴聲,以備以后使用:

http://download.csdn.net/detail/chengdong1314/9732320

總結

以上是生活随笔為你收集整理的WAV文件格式分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。