請問 聲音wav檔 讀檔頭 |
尚未結案
|
kmp
一般會員 發表:17 回覆:51 積分:13 註冊:2004-07-24 發送簡訊給我 |
各位大大: 您們好 :)
在程式方面我是超級新新手,請問 有關讀 *.wav檔的"檔頭",及讀buffer.
搜尋很久後,有一篇文章,回答的人請他參考,
http://www.borg.com/~jglatt/tech/wave.htm
但我程度不好,幫助不大,我又參考了這篇,
http://delphi.ktop.com.tw/topic.php?topic_id=30176 ,
我因不熟TMemoryStream的做法,所以也是要用buffer,
但我的問題顯示我是非常新的菜鳥, 1>請問"讀標頭檔"怎寫? 對不起,問這麼基本問題,可是我實在陷於苦思中
>請問這兩位前輩在>>>> >
|
李國維
高階會員 發表:42 回覆:287 積分:235 註冊:2003-02-07 發送簡訊給我 |
kmp:
讀取wav的標頭檔其實就是讀取wav檔案的前44各bytes.這44各bytes分別紀錄該wav檔案的格式.
可參考
http://delphi.ktop.com.tw/topic.php?topic_id=51163
http://delphi.ktop.com.tw/topic.php?topic_id=32275
|
kmp
一般會員 發表:17 回覆:51 積分:13 註冊:2004-07-24 發送簡訊給我 |
hi~李國維:
首先,謝謝,您給的網頁,
一)為止wav檔頭4-7不能改呢: 讓我比較了解wave檔頭資訊可以指到其0~44 Byte
來表示wave的型態,第45byte之後為聲音檔o
二)關於wav的問題: 看起來像是我問的問題模糊所以您也有些fuzzy,而且我想
問什情形"用MCI錄WAV",MCI (Media Control Interface)?
第二,對之前的問題有點抱歉,當我再看一次我的問題(i),(ii)
i)
是還在讀0~44 byte檔頭的部份
---------------------------------------------------
ii)
45th 讀聲音檔 我是覺我不夠用心 ,問此拙的問題,sorry.
Best Regard
引言: kmp: 讀取wav的標頭檔其實就是讀取wav檔案的前44各bytes.這44各bytes分別紀錄該wav檔案的格式. 可參考 http://delphi.ktop.com.tw/topic.php?topic_id=51163 http://delphi.ktop.com.tw/topic.php?topic_id=32275 |
koni
一般會員 發表:5 回覆:12 積分:3 註冊:2004-05-02 發送簡訊給我 |
你好:
以下是Wave檔頭44Byte所記錄的東西
========================================================
Field bytes format contains
1 0...3 str4 "RIFF" in ASCII
2 4...7 int4 Total bytes minus 8
3 8...15 str4 "WAVEfmt" Eigth character is a space
4 16...19 int4 16 for PCM format
5 20...21 int2 1 for PCM format
6 22...23 int2 channels
7 24...27 int4 sampling frequency
8 28...31 int4 bytes per second
9 32...33 int2 bytes by capture
10 34...35 int2 bits per sample
11 36:39 str4 "data"
12 40:43 int4 bytes in data
========================================================
最近剛好有在玩Wave檔,下面的code希望對您有用^^" //===================================================================
GetFileInfo(AnsiString waveFileName)
{
unsigned int i,x; //Create FileStream object
TFileStream *MyFile;
MyFile = new TFileStream(waveFileName,fmOpenRead); /*Get waveform-audio information in file's header(pre 44 bytes).*/ MyFile->Seek(4,soFromBeginning);
MyFile->Read(&SizeOfFile,sizeof(DWORD)); MyFile->Seek(16,soFromBeginning);
MyFile->Read(&SizeWaveChunk,sizeof(DWORD)); MyFile->Seek(20,soFromBeginning);
MyFile->Read(&WaveTypeFormat,sizeof(WORD)); //單聲道(1)or立體聲(2)
MyFile->Seek(22,soFromBeginning);
MyFile->Read(&MonoStereo,sizeof(WORD)); //取樣頻率(Hz)
MyFile->Seek(24,soFromBeginning);
MyFile->Read(&SampleRate,sizeof(DWORD)); MyFile->Seek(28,soFromBeginning);
MyFile->Read(&BytesSample,sizeof(DWORD)); MyFile->Seek(32,soFromBeginning);
MyFile->Read(&BlockAlignment,sizeof(WORD)); //位元數(幾bit存放一個取樣)
MyFile->Seek(34,soFromBeginning);
MyFile->Read(&BitsSample,sizeof(WORD)); //SizeOfData 44就等於該檔案的大小(Bytes)
MyFile->Seek(40,soFromBeginning);
MyFile->Read(&SizeOfData,sizeof(DWORD)); //取得總取樣個數.
nDataChunks = SizeOfData/BlockAlignment; //44Byte後開始就是實際的取樣資料(音訊資料)
//ps:我的位元數是2Byte,所以用short
short *WaveData = (short *)calloc(nDataChunks,sizeof(short));
for(i=0;i<(unsigned int)m_nDataChunks;i )
{
MyFile->Seek(44 i*2,soFromBeginning);
MyFile->Read(&WaveData[i],sizeof(short));
} delete(MyFile);
//===================================================================
不要忘了要宣告變數放上面那一些資料喔(像是MonoStereo、BlockAlignment那
一些,型態就是sizeof(...)中間的型態)~ by Koni.
|
koni
一般會員 發表:5 回覆:12 積分:3 註冊:2004-05-02 發送簡訊給我 |
Sorry~阿~剛才那個是「讀」header的方法,忘了你是要問「寫」的,
下面的也請你參考看看吧^^"
//變數宣告 DWORD SizeOfFile; DWORD SizeWaveChunk; WORD WaveTypeFormat; //PCM. WORD MonoStereo; //0x01 Mono. 0x02 Stereo. DWORD SampleRate; DWORD BytesSample; WORD BlockAlignment; WORD BitsSample; DWORD SizeDataChunk; DWORD Temp; //lpNumberOfBytesWritten. WORD nDataChunks; //Sample numbers. DWORD SizeOfData; //The size of real WAV data. DWORD SizeChunk; //(one)Sample width. SaveToFile(AnsiString SaveFileName) { HANDLE HFile; //Create a waveform audio file. HFile=CreateFile(SaveFileName.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if(HFile==INVALID_HANDLE_VALUE) throw("Error on CreateFile"); //Define the file format is waveform audio WriteFile(HFile,"RIFF",4,&Temp,NULL); //0~3 Byte m_SizeOfFile=44 nDataChunks*2-8; WriteFile(HFile,&SizeOfFile,4,&Temp,NULL); //4~7 Byte WriteFile(HFile,"WAVE",4,&Temp,NULL); //8~11 Byte //Waveform format WriteFile(HFile,"fmt ",4,&Temp,NULL); //12~15 Byte WriteFile(HFile,&SizeWaveChunk,4,&Temp,NULL); //16~19 Byte WriteFile(HFile,&WaveTypeFormat,2,&Temp,NULL); //20~12 Byte WriteFile(HFile,&MonoStereo,2,&Temp,NULL); //22~23 Byte WriteFile(HFile,&SampleRate,4,&Temp,NULL); //24~27 Byte WriteFile(HFile,&BytesSample,4,&Temp,NULL); //28~31 Byte WriteFile(HFile,&BlockAlignment,2,&Temp,NULL); //32~33 Byte WriteFile(HFile,&BitsSample,2,&Temp,NULL); //34~35 Byte //Waveform data size WriteFile(HFile,"data",4,&Temp,NULL); //36~39 Byte SizeOfData=nDataChunks*2; WriteFile(HFile,&SizeOfData,4,&Temp,NULL); //40~43 Byte //寫入音訊資料段(44~ Byte) WriteFile(m_HFile,WaveData,SizeOfData,&Temp,NULL); CloseHandle(HFile); }可以參考看看,關於CreateFile(...) 及 WriteFile(...)的用法可以去SDK查一下。 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |