利用C语言读取WAV文件
生活随笔
收集整理的這篇文章主要介紹了
利用C语言读取WAV文件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
使用說明
- 簡介
- 打印文件頭信息
- 調整代碼
- ExtractData.c
- ExtractData.h
簡介
改了一下網上的代碼,文件頭不再寫入txt。使用時,代碼中填入wav文件和txt文件路徑。wav文件的文件頭信息會打印出來,音頻數據則寫入txt文件。
打印文件頭信息
終端中會打印出文件頭的一些信息,包括NumChannels(聲道數),SampleRate(采樣頻率),BitsPerSample(每個樣本多少位)等。通過更改showWavHead()函數來打印你需要的信息。
調整代碼
你需要根據文件頭中各種信息來調整代碼。
文件頭中各項信息的含義見:http://soundfile.sapp.org/doc/WaveFormat/
比如說,我的wav文件BitsPerSample是16,一個聲道的一個樣本占2字節。如果你的BitsPerSample不是16,你的FileLength(txt文件數據長度,或者叫數據個數)就不是由FileEnd(wav文件字節數)除以2(改成對應的字節數)來得到。
ExtractData.c
#include <stdio.h> #include "ExtractData.h"#define W 128 //每次讀寫文件的數據量 int FileSet = 0; //定義一個整型變量, 用于保存fseek函數的返回值 int FileEnd = 0; //整個文件的字節數 int FileLength = 0; //文件的數據長度。(注:每2個字節作為一個數據 ) short InputData[W]; //文件讀寫數據緩沖區 WAVHEADER FileHeader; //存文件頭的結構體void showWavHead(WAVHEADER Header) {printf("ChunkID: %c%c%c%c\t",Header.ChunkID[0],Header.ChunkID[1],Header.ChunkID[2],Header.ChunkID[3]);printf("ChunkSize: %u\t", Header.ChunkSize);printf("Format: %c%c%c%c\n",Header.Format[0],Header.Format[1],Header.Format[2],Header.Format[3]);printf("FmtChunkID: %c%c%c%c\t",Header.FmtChunkID[0],Header.FmtChunkID[1],Header.FmtChunkID[2],Header.FmtChunkID[3]);printf("FmtChunkSize: %u\t", Header.FmtChunkSize);printf("AudioFormat: %d\t", Header.AudioFormat);printf("NumChannels: %d\t", Header.NumChannels);printf("SampleRate: %u\t", Header.SampleRate);printf("ByteRate: %u\t", Header.ByteRate);printf("BlockAlign: %d\t", Header.BlockAlign);printf("BitsPerSample: %d\n", Header.BitsPerSample);printf("DataChunkID: %c%c%c%c\t", Header.DataChunkID[0],Header.DataChunkID[1],Header.DataChunkID[2],Header.DataChunkID[3]);printf("DataChunkSize: %u\n", Header.DataChunkSize); }int main() {FILE *Ifp, *txt; //定義文件讀寫指針 Ifp = fopen(".wav","rb"); /*以只讀方式打開wav文件*/txt = fopen(".txt","w");/* 獲得文件字節數,fseek函數將文件內部指針指向文件末尾,ftell函數獲取文件內部指針相對于文件頭的偏移量,rewind函數將文件內部指針指向文件頭 */fseek(Ifp, 0L, SEEK_END); FileEnd = ftell(Ifp); printf("total file size: %d bytes \n", FileEnd); rewind(Ifp); // 讀取文件頭,并打印部分信息,wav格式的文件頭一般是44個字節,后面是音頻數據fread(&FileHeader, 1, sizeof(WAVHEADER), Ifp);showWavHead(FileHeader);// 讀取數據。這里的數據大小是2字節,按照實際格式改。while循環每次讀寫 W 個數據量,for循環寫最后剩余的FileLength = FileEnd / 2;while (FileLength >= W) {fread(InputData, sizeof(short), W, Ifp);for (int i = 0; i < W; i++) {fprintf(txt,"%d\n",InputData[i]);}FileLength -= W;}fread(InputData, sizeof(short), FileLength, Ifp); for (int i = 0; i < FileLength; i++) {fprintf(txt, "%d\n", InputData[i]);}return 0; }ExtractData.h
wav文件的文件頭一般是44字節(除非fmt塊后面有ExtraParamSize 和ExtraParams 項)。Header詳細信息見上文鏈接。
- uint8_t: unsigned char
- uint16_t: unsigned short
- uint32_t: unsigned int
總結
以上是生活随笔為你收集整理的利用C语言读取WAV文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在线java编译器
- 下一篇: ie浏览器css怎么调,IE浏览器下的C