在bcb使用WinAPI函式撥放PCM資料
2010/01/24 11:03
瀏覽250
迴響0
推薦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;
解答:
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;
你可能會有興趣的文章:
限會員,要發表迴響,請先登入

