字體:小 中 大 |
|
|
|
| 2010/01/24 11:03:00瀏覽252|回應0|推薦0 | |
| 問題:我有一個pcm檔案(純資料檔),我要如何使用BCB/VC++的WindowsAPI函式撥放這個PCM格式的資料? 解答: char Example_Wave[]= { 0x52,0x49,0x46,0x46,//RIFF標誌 0x44,0x93,0x6F,0x00,//文件長度,這邊是 7312196 byte 0x57,0x41,0x56,0x45,//Wave標誌 0x66,0x6D,0x74,0x20,//fmt標誌 0x10,0x00,0x00,0x00,//non 0x03,0x00, //格式類別 0x02,0x00, //channel 數量 0x80,0xBB,0x00,0x00,//取樣頻率,這邊是bb80h = 48000 0x00,0xDC,0x05,0x00,//波形音頻數據傳送速率,其值為通道數×每秒數據位數×每樣 //本的數據位數/8。播放軟件利用此值可以估計緩衝區的大小。 0x08,0x00, //數據塊的調整數(按字節算的),其值為通道數×每樣本的數據位值/8。 //播放軟件需要一次處理多個該值大小的字節數據,以便將其值用於緩衝區的調整。 0x20,0x00, //每樣本的數據位數,表示每個聲道中各個樣本的數據位數。這邊是32 bytes //如果有多個聲道,對每個聲道而言,樣本大小都一樣。 0x64,0x61,0x74,0x61,//數據標記符”data” 0x20,0x93,0x6F,0x00 //語音數據的長度 7312160 byte }; struct WaveForm { char szRiffID[4]; // 'R','I','F','F' int dwRiffSize; char szRiffFormat[4]; // 'W','A','V','E' char szFmtID[4]; // 'f','m','t',' ' int dwFmtSize; short wFormatTag; short wChannels; int dwSamplesPerSec; int dwAvgBytesPerSec; short wBlockAlign; short wBitsPerSample; char szDataID[4]; // 'd','a','t','a' int dwDataSize; }*Wave; Wave = (struct WaveForm*) Example_Wave; TMemoryStream *pcm = new TMemoryStream; pcm->LoadFromFile(OpenDialog1->FileName); Wave->dwDataSize = pcm->Size; Wave->dwRiffSize = pcm->Size+36; TMemoryStream *wav2 = new TMemoryStream; wav2->Write(Wave,sizeof(struct WaveForm)); wav2->Write(pcm->Memory,pcm->Size); PlaySound((char *)wav2->Memory, 0, SND_SYNC | SND_MEMORY); delete pcm; delete wav2; |
|
| ( 不分類|不分類 ) |










