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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

WAV音频文件的分析

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

1.WAV文件的格式

wav是微軟開發的一種音頻文件格式,注意,wav文件格式是無損音頻文件格式,相對于其他音頻格式文件數據是沒有經過壓縮的,通常文件也相對比較大些。

支持多種音頻數字,取樣頻率和聲道,標準格式化的WAV文件和CD格式一樣,也是44.1K的取樣頻率,16位量化數字,因此在聲音文件質量和CD相差無幾! WAV打開工具是WINDOWS的媒體播放器。
通常使用三個參數來表示聲音量化位數,取樣頻率和采樣點振幅。量化位數分為8位,16位,24位三種,聲道單聲道和立體聲之分,單聲道振幅數據為n*1矩陣點,立體聲為n*2矩陣點,取樣頻率一般有11025Hz(11kHz) ,22050Hz(22kHz)和44100Hz(44kHz) 三種,不過盡管音質出色,但在壓縮后的文件體積過大!相對其他音頻格式而言是一個缺點,其?文件大小的計算方式為:WAV格式文件所占容量(B) = (取樣頻率 X量化位數X 聲道) X 時間 / 8 (字節= 8bit)?每一分鐘WAV格式的音頻文件的大小為10MB,其大小不隨音量大小及清晰度的變化而變化。

  • WAV格式大小:采樣率一般是44.1K,16bit采樣精度,存儲成WAV格式大小?= 44.1KHz(采樣率) X 16bit(采樣位數) X 2(雙聲道) X ?播放時間

  • WAV格式是沒有壓縮無損的,MP3格式是按1:12壓縮保存的,所以MP3格式大小等于上式的1/12。WAV本質上是無壓縮的原始音頻文件。

  • 參考文件格式分析:WAV文件格式分析_zhihu008的博客-CSDN博客

2.wav的組成

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

?

#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文件的聲音數據保存在數據塊中。塊標識符為“data”,?塊長度值為聲音數據的長度。

從數據塊的第9個字符開始是聲音波形采樣數據。每個樣本按采樣的時間先后順序寫入。樣本的字節數取決于采樣位數。對于多字節樣本,?低位字節數據?放在低地址單元,相鄰的高位字節數據放在高地址單元。多聲道樣本數據采用交替方式存儲。例如: 立體聲(雙聲道)采樣值的存儲順序為:

  • 通道1第1采樣值, 通道2第1采樣值;通道1第2采樣值, 通道2第2采樣值;以此類推。基于PCM編碼的樣本數據排列方式。

?

?

(1)“52 49 46 46”這個是Ascii字符“RIFF”,這部分是固定格式,表明這是一個WAVE文件頭。
(2)“22 60 28 00”,這個是我這個WAV文件的數據大小,這個大小包括除了前面4個字節的所有字節,也就等于文件總字節數減去8。16進制的“22 60 28 00”對應是十進制的“2646050”。
(3)“57 41 56 45 66 6D 74 20”,也是Ascii字符“WAVEfmt”,這部分是固定格式。
以后是PCMWAVEFORMAT部分

(4)“12 00 00 00”,這是一個DWORD,對應數字18,這個對應定義中的PCMWAVEFORMAT部分的大小,可以看到后面的這個段內容正好是18個字節。一般情況下大小為16,此時最后附加信息沒有,上面這個文件多了兩個字節的附加信息。
(5)“01 00”,這是一個WORD,對應定義為編碼格式(WAVE_FORMAT_PCM格式一般用的是這個)。
(6)“01 00”,這是一個WORD,對應數字1,表示聲道數為1,是個單聲道Wav。
(7)“22 56 00 00”對應數字22050,代表的是采樣頻率22050,采樣率(每秒樣本數),表示每個通道的播放速度
(8)“44 AC 00 00”對應數字44100,代表的是每秒的數據量,波形音頻數據傳送速率,其值為通道數×每秒樣本數×每樣本的數據位數/8(1*22050*16/8)。播放軟件利用此值可以估計緩沖區的大小。
(9)“02 00”對應數字是2,表示塊對齊的內容。數據塊的調整數(按字節算的),其值為通道數×每樣本的數據位值/8。播放軟件需要一次處理多個該值大小的字節數據,以便將其值用于緩沖區的調整。
(10)“10 00”數值為16,采樣大小為16Bits,每樣本的數據位數,表示每個聲道中各個樣本的數據位數。如果有多個聲道,對每個聲道而言,樣本大小都一樣。
(11)“00 00”此處為附加信息(可選),和(4)中的size對應。

(12)“66 61 73 74”?Fact是可選字段,一般當wav文件由某些軟件轉化而成,則包含該項,“04 00 00 00”Fact字段的大小為4字節,“F8 2F 14 00”是fact數據。

(13)“64 61 74 61”,這個是Ascii字符“data”,標示頭結束,開始數據區域。
(14)“F0 5F 28 00”十六進制數是“0x285ff0”,對應十進制2646000,是數據區的開頭,以后數據總數,看一下前面正好可以看到,文件大小是2646050,從(2)到(13)包括(13)正好是2646050-2646000=50字節

總結

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

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