全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:6969
推到 Plurk!
推到 Facebook!

請問 聲音wav檔 讀檔頭

尚未結案
kmp
一般會員


發表:17
回覆:51
積分:13
註冊:2004-07-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-23 23:18:12 IP:211.74.xxx.xxx 未訂閱
各位大大:    您們好 :)          在程式方面我是超級新新手,請問    有關讀 *.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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-24 00:33:03 IP:218.167.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-24 04:24:20 IP:211.74.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-24 14:40:12 IP:61.70.xxx.xxx 未訂閱
你好: 以下是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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-24 14:50:12 IP:61.70.xxx.xxx 未訂閱
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查一下。
系統時間:2024-05-20 23:39:13
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!