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

將讀入buffer的聲音檔資料秀成波形

尚未結案
samhuang426
一般會員


發表:5
回覆:4
積分:1
註冊:2004-11-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-30 02:05:52 IP:140.132.xxx.xxx 未訂閱
請問各位先進,拜讀站上的文章後已可將聲音檔的header及聲音資料讀出,小弟是參考koni大大以下程式碼將聲音資料讀入buffer: //=================================================================== 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); //=================================================================== 1.想請問讀入後的資料若要畫成波形的話,並且用時間來表示成x軸,y軸表示成值的大小,該如何下手呢? 2.buffer的大小是否有大小限制?(是否即電腦實體記憶體的大小) 感謝您不吝指導 發表人 - samhuang426 於 2004/11/30 02:07:28
李國維
高階會員


發表:42
回覆:287
積分:235
註冊:2003-02-07

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-30 10:35:05 IP:219.84.xxx.xxx 未訂閱
samhuang426: 你可以試著用TChart來進行.我想可以達到你要的功能. 也有人是利用TCanvas來繪製.兩者均可. http://delphi.ktop.com.tw/topic.php?TOPIC_ID=55087
samhuang426
一般會員


發表:5
回覆:4
積分:1
註冊:2004-11-29

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-30 15:13:42 IP:140.132.xxx.xxx 未訂閱
再請教從buffer讀出的二進位資料要怎麼轉換成相對應的座標值?其實小弟剛接觸bcb,對於其中資料型態轉換以及數值從記憶體取出的處理觀念不是很懂,有哪位先進可以指導一下嗎?感激不盡
李國維
高階會員


發表:42
回覆:287
積分:235
註冊:2003-02-07

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-01 14:54:06 IP:219.84.xxx.xxx 未訂閱
samhuang426: 舉例來說
int i,yValue;
int len;//len表示長度
for ( i = 0 ; i < len ; i   )
{
 yValue = WaveData[i];
 Chart1->Series[0]->AddY((double)yValue,"",clRed);
}
系統時間:2024-05-18 15:17:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!