WAV音频文件的分析
1.WAV文件的格式
wav是微軟開(kāi)發(fā)的一種音頻文件格式,注意,wav文件格式是無(wú)損音頻文件格式,相對(duì)于其他音頻格式文件數(shù)據(jù)是沒(méi)有經(jīng)過(guò)壓縮的,通常文件也相對(duì)比較大些。
支持多種音頻數(shù)字,取樣頻率和聲道,標(biāo)準(zhǔn)格式化的WAV文件和CD格式一樣,也是44.1K的取樣頻率,16位量化數(shù)字,因此在聲音文件質(zhì)量和CD相差無(wú)幾! WAV打開(kāi)工具是WINDOWS的媒體播放器。
通常使用三個(gè)參數(shù)來(lái)表示聲音,量化位數(shù),取樣頻率和采樣點(diǎn)振幅。量化位數(shù)分為8位,16位,24位三種,聲道有單聲道和立體聲之分,單聲道振幅數(shù)據(jù)為n*1矩陣點(diǎn),立體聲為n*2矩陣點(diǎn),取樣頻率一般有11025Hz(11kHz) ,22050Hz(22kHz)和44100Hz(44kHz) 三種,不過(guò)盡管音質(zhì)出色,但在壓縮后的文件體積過(guò)大!相對(duì)其他音頻格式而言是一個(gè)缺點(diǎn),其?文件大小的計(jì)算方式為:WAV格式文件所占容量(B) = (取樣頻率 X量化位數(shù)X 聲道) X 時(shí)間 / 8 (字節(jié)= 8bit)?每一分鐘WAV格式的音頻文件的大小為10MB,其大小不隨音量大小及清晰度的變化而變化。
-
WAV格式大小:采樣率一般是44.1K,16bit采樣精度,存儲(chǔ)成WAV格式大小?= 44.1KHz(采樣率) X 16bit(采樣位數(shù)) X 2(雙聲道) X ?播放時(shí)間
-
WAV格式是沒(méi)有壓縮無(wú)損的,MP3格式是按1:12壓縮保存的,所以MP3格式大小等于上式的1/12。WAV本質(zhì)上是無(wú)壓縮的原始音頻文件。
-
參考文件格式分析:WAV文件格式分析_zhihu008的博客-CSDN博客
2.wav的組成
- WAVE文件是非常簡(jiǎn)單的一種RIFF文件,它的格式類(lèi)型為"WAVE"。RIFF塊包含兩個(gè)子塊,這兩個(gè)子塊的ID分別是?"fmt"?和?"data",其中?"fmt"?子塊由結(jié)構(gòu)PcmWaveFormat所組成,其子塊的大小就是sizeof(PcmWaveFormat),數(shù)據(jù)組成就是PcmWaveFormat結(jié)構(gòu)中的數(shù)據(jù)。
?
#ifndef RESOLVE_WAV_WAVE_H #define RESOLVE_WAV_WAVE_H#include <cstdint>typedef struct WAV_RIFF {/* chunk "riff" */char ChunkID[4]; /* "RIFF" *//* sub-chunk-size */uint32_t ChunkSize; /* 36 + Subchunk2Size *//* sub-chunk-data */char Format[4]; /* "WAVE" */ } RIFF_t;typedef struct WAV_FMT {/* sub-chunk "fmt" */char Subchunk1ID[4]; /* "fmt " *//* sub-chunk-size */uint32_t Subchunk1Size; /* 16 for PCM *//* sub-chunk-data */uint16_t AudioFormat; /* PCM = 1*/uint16_t NumChannels; /* Mono = 1, Stereo = 2, etc. */uint32_t SampleRate; /* 8000, 44100, etc. */uint32_t ByteRate; /* = SampleRate * NumChannels * BitsPerSample/8 */uint16_t BlockAlign; /* = NumChannels * BitsPerSample/8 */uint16_t BitsPerSample; /* 8bits, 16bits, etc. */ } FMT_t;typedef struct WAV_data {/* sub-chunk "data" */char Subchunk2ID[4]; /* "data" *//* sub-chunk-size */uint32_t Subchunk2Size; /* data size *//* sub-chunk-data */ // Data_block_t block; } Data_t;//typedef struct WAV_data_block { //} Data_block_t;typedef struct WAV_fotmat {RIFF_t riff;FMT_t fmt;Data_t data; } Wav;#endif //RESOLVE_WAV_WAVE_H uint8_t: unsigned char uint16_t:unsigned short int uint32_t:unsigned int uint64_t: unsigned long int wave.cpp #include <stdio.h> #include <stdint.h> #include <stdlib.h> #include "wave.h" int main() {FILE *fp = NULL;Wav wav;RIFF_t riff;FMT_t fmt;Data_t data;fp = fopen("/home/douzi/Douzi_qdreamer/resolve_wav/mbfio_mic3.wav", "rb");if (!fp) {printf("can't open audio file\n");exit(1);}fread(&wav, 1, sizeof(wav), fp);riff = wav.riff;fmt = wav.fmt;data = wav.data;/*** RIFF*/printf("ChunkID \t\t%c%c%c%c\n", riff.ChunkID[0], riff.ChunkID[1], riff.ChunkID[2], riff.ChunkID[3]);printf("ChunkSize \t\t%d\n", riff.ChunkSize);printf("Format \t\t\t%c%c%c%c\n", riff.Format[0], riff.Format[1], riff.Format[2], riff.Format[3]);printf("\n");/*** fmt*/printf("Subchunk1ID \t%c%c%c%c\n", fmt.Subchunk1ID[0], fmt.Subchunk1ID[1], fmt.Subchunk1ID[2], fmt.Subchunk1ID[3]);printf("Subchunk1Size \t%d\n", fmt.Subchunk1Size);printf("AudioFormat \t%d\n", fmt.AudioFormat);printf("NumChannels \t%d\n", fmt.NumChannels);printf("SampleRate \t\t%d\n", fmt.SampleRate);printf("ByteRate \t\t%d\n", fmt.ByteRate);printf("BlockAlign \t\t%d\n", fmt.BlockAlign);printf("BitsPerSample \t%d\n", fmt.BitsPerSample);printf("\n");/*** data*/printf("blockID \t\t%c%c%c%c\n", data.Subchunk2ID[0], data.Subchunk2ID[1], data.Subchunk2ID[2], data.Subchunk2ID[3]);printf("blockSize \t\t%d\n", data.Subchunk2Size);printf("\n");// duration = Subchunk2Size / ByteRateprintf("duration \t\t%d\n", data.Subchunk2Size / fmt.ByteRate);}?
WAV文件的聲音數(shù)據(jù)保存在數(shù)據(jù)塊中。塊標(biāo)識(shí)符為“data”,?塊長(zhǎng)度值為聲音數(shù)據(jù)的長(zhǎng)度。
從數(shù)據(jù)塊的第9個(gè)字符開(kāi)始是聲音波形采樣數(shù)據(jù)。每個(gè)樣本按采樣的時(shí)間先后順序?qū)懭搿?strong>樣本的字節(jié)數(shù)取決于采樣位數(shù)。對(duì)于多字節(jié)樣本,?低位字節(jié)數(shù)據(jù)?放在低地址單元,相鄰的高位字節(jié)數(shù)據(jù)放在高地址單元。多聲道樣本數(shù)據(jù)采用交替方式存儲(chǔ)。例如: 立體聲(雙聲道)采樣值的存儲(chǔ)順序?yàn)?
- 通道1第1采樣值, 通道2第1采樣值;通道1第2采樣值, 通道2第2采樣值;以此類(lèi)推。基于PCM編碼的樣本數(shù)據(jù)排列方式。
?
?
(1)“52 49 46 46”這個(gè)是Ascii字符“RIFF”,這部分是固定格式,表明這是一個(gè)WAVE文件頭。
(2)“22 60 28 00”,這個(gè)是我這個(gè)WAV文件的數(shù)據(jù)大小,這個(gè)大小包括除了前面4個(gè)字節(jié)的所有字節(jié),也就等于文件總字節(jié)數(shù)減去8。16進(jìn)制的“22 60 28 00”對(duì)應(yīng)是十進(jìn)制的“2646050”。
(3)“57 41 56 45 66 6D 74 20”,也是Ascii字符“WAVEfmt”,這部分是固定格式。
以后是PCMWAVEFORMAT部分
(4)“12 00 00 00”,這是一個(gè)DWORD,對(duì)應(yīng)數(shù)字18,這個(gè)對(duì)應(yīng)定義中的PCMWAVEFORMAT部分的大小,可以看到后面的這個(gè)段內(nèi)容正好是18個(gè)字節(jié)。一般情況下大小為16,此時(shí)最后附加信息沒(méi)有,上面這個(gè)文件多了兩個(gè)字節(jié)的附加信息。
(5)“01 00”,這是一個(gè)WORD,對(duì)應(yīng)定義為編碼格式(WAVE_FORMAT_PCM格式一般用的是這個(gè))。
(6)“01 00”,這是一個(gè)WORD,對(duì)應(yīng)數(shù)字1,表示聲道數(shù)為1,是個(gè)單聲道Wav。
(7)“22 56 00 00”對(duì)應(yīng)數(shù)字22050,代表的是采樣頻率22050,采樣率(每秒樣本數(shù)),表示每個(gè)通道的播放速度
(8)“44 AC 00 00”對(duì)應(yīng)數(shù)字44100,代表的是每秒的數(shù)據(jù)量,波形音頻數(shù)據(jù)傳送速率,其值為通道數(shù)×每秒樣本數(shù)×每樣本的數(shù)據(jù)位數(shù)/8(1*22050*16/8)。播放軟件利用此值可以估計(jì)緩沖區(qū)的大小。
(9)“02 00”對(duì)應(yīng)數(shù)字是2,表示塊對(duì)齊的內(nèi)容。數(shù)據(jù)塊的調(diào)整數(shù)(按字節(jié)算的),其值為通道數(shù)×每樣本的數(shù)據(jù)位值/8。播放軟件需要一次處理多個(gè)該值大小的字節(jié)數(shù)據(jù),以便將其值用于緩沖區(qū)的調(diào)整。
(10)“10 00”數(shù)值為16,采樣大小為16Bits,每樣本的數(shù)據(jù)位數(shù),表示每個(gè)聲道中各個(gè)樣本的數(shù)據(jù)位數(shù)。如果有多個(gè)聲道,對(duì)每個(gè)聲道而言,樣本大小都一樣。
(11)“00 00”此處為附加信息(可選),和(4)中的size對(duì)應(yīng)。
(12)“66 61 73 74”?Fact是可選字段,一般當(dāng)wav文件由某些軟件轉(zhuǎn)化而成,則包含該項(xiàng),“04 00 00 00”Fact字段的大小為4字節(jié),“F8 2F 14 00”是fact數(shù)據(jù)。
(13)“64 61 74 61”,這個(gè)是Ascii字符“data”,標(biāo)示頭結(jié)束,開(kāi)始數(shù)據(jù)區(qū)域。
(14)“F0 5F 28 00”十六進(jìn)制數(shù)是“0x285ff0”,對(duì)應(yīng)十進(jìn)制2646000,是數(shù)據(jù)區(qū)的開(kāi)頭,以后數(shù)據(jù)總數(shù),看一下前面正好可以看到,文件大小是2646050,從(2)到(13)包括(13)正好是2646050-2646000=50字節(jié)
總結(jié)
以上是生活随笔為你收集整理的WAV音频文件的分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 自考 软件工程专业 07029 软件项目
- 下一篇: 电子政务简答题