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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

利用C语言读取WAV文件

發(fā)布時間:2024/8/1 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用C语言读取WAV文件 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

使用說明

  • 簡介
      • 打印文件頭信息
      • 調(diào)整代碼
      • ExtractData.c
      • ExtractData.h

簡介

改了一下網(wǎng)上的代碼,文件頭不再寫入txt。使用時,代碼中填入wav文件和txt文件路徑。wav文件的文件頭信息會打印出來,音頻數(shù)據(jù)則寫入txt文件。

打印文件頭信息

終端中會打印出文件頭的一些信息,包括NumChannels(聲道數(shù)),SampleRate(采樣頻率),BitsPerSample(每個樣本多少位)等。通過更改showWavHead()函數(shù)來打印你需要的信息。

調(diào)整代碼

你需要根據(jù)文件頭中各種信息來調(diào)整代碼。

文件頭中各項信息的含義見:http://soundfile.sapp.org/doc/WaveFormat/

比如說,我的wav文件BitsPerSample是16,一個聲道的一個樣本占2字節(jié)。如果你的BitsPerSample不是16,你的FileLength(txt文件數(shù)據(jù)長度,或者叫數(shù)據(jù)個數(shù))就不是由FileEnd(wav文件字節(jié)數(shù))除以2(改成對應的字節(jié)數(shù))來得到。

ExtractData.c

#include <stdio.h> #include "ExtractData.h"#define W 128 //每次讀寫文件的數(shù)據(jù)量 int FileSet = 0; //定義一個整型變量, 用于保存fseek函數(shù)的返回值 int FileEnd = 0; //整個文件的字節(jié)數(shù) int FileLength = 0; //文件的數(shù)據(jù)長度。(注:每2個字節(jié)作為一個數(shù)據(jù) ) short InputData[W]; //文件讀寫數(shù)據(jù)緩沖區(qū) WAVHEADER FileHeader; //存文件頭的結(jié)構(gòu)體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");/* 獲得文件字節(jié)數(shù),fseek函數(shù)將文件內(nèi)部指針指向文件末尾,ftell函數(shù)獲取文件內(nèi)部指針相對于文件頭的偏移量,rewind函數(shù)將文件內(nèi)部指針指向文件頭 */fseek(Ifp, 0L, SEEK_END); FileEnd = ftell(Ifp); printf("total file size: %d bytes \n", FileEnd); rewind(Ifp); // 讀取文件頭,并打印部分信息,wav格式的文件頭一般是44個字節(jié),后面是音頻數(shù)據(jù)fread(&FileHeader, 1, sizeof(WAVHEADER), Ifp);showWavHead(FileHeader);// 讀取數(shù)據(jù)。這里的數(shù)據(jù)大小是2字節(jié),按照實際格式改。while循環(huán)每次讀寫 W 個數(shù)據(jù)量,for循環(huán)寫最后剩余的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字節(jié)(除非fmt塊后面有ExtraParamSize 和ExtraParams 項)。Header詳細信息見上文鏈接。

  • uint8_t: unsigned char
  • uint16_t: unsigned short
  • uint32_t: unsigned int
#ifndef _EXTRACTDATA_H_ #define _EXTRACTDATA_H_#include <stdint.h>typedef struct tagWAVHEADER {uint8_t ChunkID[4]; // 文檔標識。 大寫字符串"RIFF",標明該文件為有效的 RIFF 格式文檔。uint32_t ChunkSize; // 文件數(shù)據(jù)長度。 從下一個字段首地址開始到文件末尾的總字節(jié)數(shù)。該字段的數(shù)值加 8 為當前文件的實際長度。uint8_t Format[4]; // 文件格式類型。 所有 WAV 格式的文件此處為字符串"WAVE",標明該文件是 WAV 格式文件。uint8_t FmtChunkID[4]; // 格式塊標識。 小寫字符串,"fmt "。uint32_t FmtChunkSize; // 格式塊長度。 其數(shù)值不確定,取決于編碼格式。可以是 16、 18 、20、40 等。uint16_t AudioFormat; // 編碼格式代碼。 常見的 WAV 文件使用 PCM 脈沖編碼調(diào)制格式,該數(shù)值通常為 1。uint16_t NumChannels; // 聲道個數(shù)。 單聲道為 1,立體聲或雙聲道為 2。uint32_t SampleRate; // 采樣頻率。 每個聲道單位時間采樣次數(shù)。常用的采樣頻率有 11025, 22050 和 44100 kHz。uint32_t ByteRate; // 數(shù)據(jù)傳輸速率。 該數(shù)值為:聲道數(shù)×采樣頻率×每樣本的數(shù)據(jù)位數(shù)/8。播放軟件利用此值可以估計緩沖區(qū)的大小。uint16_t BlockAlign; // 數(shù)據(jù)塊對齊單位。 采樣幀大小。該數(shù)值為:聲道數(shù)×位數(shù)/8。播放軟件需要一次處理多個該值大小的字節(jié)數(shù)據(jù),用該數(shù)值調(diào)整緩沖區(qū)。uint16_t BitsPerSample; // 采樣位數(shù)。 存儲每個采樣值所用的二進制數(shù)位數(shù)。常見的位數(shù)有 4、8、12、16、24、32。uint8_t DataChunkID[4];uint32_t DataChunkSize; } WAVHEADER;#endif // #ifndef _EXTRACTDATA_H_

總結(jié)

以上是生活随笔為你收集整理的利用C语言读取WAV文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: av影院在线播放 | 男人添女人荫蒂国产 | 天天透天天干 | 久久91精品 | 少妇诱惑av | 日本欧美一区二区三区不卡视频 | 黑人精品欧美一区二区蜜桃 | 国产午夜性春猛交ⅹxxx | 涩涩涩av | 亚洲 欧美 国产 另类 | 尤物久久 | 国产伦精品一区二区三区视频痴汉 | 传媒av在线 | 中文字幕亚洲一区 | 日韩大片免费在线观看 | 免费看欧美片 | 快播av在线 | 成人h动漫在线 | 色一情一伦一子一伦一区 | 天天舔天天干 | 蜜臀久久精品久久久久 | 91porny九色 | 91精品国产综合久久香蕉 | 麻豆影视大全 | www.黄色av| 成人看片黄a免费看视频 | 国产aⅴ精品一区二区果冻 台湾性生生活1 | 国产精彩视频在线观看 | 国产精品98 | 91免费版黄色 | 欧美经典一区二区 | 免费av手机在线观看 | 中文字幕一区二区三区在线不卡 | xxxx久久| 黄网在线免费 | 清纯唯美亚洲激情 | 亚洲精品中文字幕乱码三区91 | 京香julia在线观看 | 国产999视频 | 国产成人+综合亚洲+天堂 | 91视| 99久久婷婷国产综合精品草原 | 五月天婷婷在线视频 | 少妇毛片一区二区三区粉嫩av | 久久久精品视频免费 | 国产少妇自拍 | 暖暖日本在线视频 | 免费中文av | 日韩在线视频一区二区三区 | 久久综合一区二区 | 妺妺窝人体色www在线下载 | 波多av在线 | 狠狠躁日日躁夜夜躁2022麻豆 | 香蕉视频影院 | 一区二区日韩精品 | 亚洲精品白浆 | www.黄色网 | 67194午夜| 亚洲人精品| 青青青草视频 | 日韩电影在线观看中文字幕 | 日本久久高清视频 | 不卡三区| 亚洲女人天堂网 | 第一次破处视频 | 在线色 | 熟睡侵犯の奶水授乳在线 | 噜噜噜视频 | 日本不卡一区在线观看 | 91亚洲一区 | 国产午夜在线播放 | 国产乱码一区 | 欧美一区二区三区成人久久片 | 激情中文网| 国产又粗又长又黄视频 | 欧美第九页 | av青青草 | 黄色资源在线播放 | 国产麻豆精品在线 | 娇妻被老王脔到高潮失禁视频 | 狠狠躁日日躁夜夜躁2022麻豆 | 久久9久久 | 激情春色网 | 西西人体www大胆高清 | 中国特级毛片 | 在线a级 | 亚洲欧美一区二区三区在线观看 | 亚洲痴女| 插插插综合 | 中文字幕欧美亚洲 | 91麻豆产精品久久久久久夏晴子 | 无码人妻精品一区二区三区在线 | 黄色片网站视频 | 美日韩在线视频 | www夜插内射视频网站 | 国产激情av一区二区三区 | 欧美激情一二三区 | 日韩av在线观看免费 | 日韩狠狠 |