(五)讀取wav的實(shí)例
跟據(jù)WAVE文件的格式,實(shí)現(xiàn)了讀取雙聲道立體聲數(shù)據(jù)的例子如下:
| BYTE * GetData(Cstring *pString) //獲取聲音文件數(shù)據(jù)的函數(shù),pString參數(shù)指向要打開的聲音文件; { if (pString==NULL) return NULL; HMMIO file1;//定義HMMIO文件句柄; file1=mmioOpen((LPSTR)pString,NULL,MMIO_READWRITE); //以讀寫模式打開所給的WAVE文件; if(file1==NULL) { MessageBox("WAVE文件打開失敗!"); Return NULL; } char style[4];//定義一個四字節(jié)的數(shù)據(jù),用來存放文件的類型; mmioSeek(file1,8,SEEK_SET);//定位到WAVE文件的類型位置 mmioRead(file1,style,4); if(style[0]!='W'||style[1]!='A'||style[2]!='V'||style[3]!='E') //判斷該文件是否為"WAVE"文件格式 { MessageBox("該文件不是WAVE格式的文件!"); Return NULL; } PCMWAVEFORMAT format; //定義PCMWAVEFORMAT結(jié)構(gòu)對象,用來判斷WAVE文件格式; mmioSeek(file1,20,SEEK_SET); //對打開的文件進(jìn)行定位,此時指向WAVE文件的PCMWAVEFORMAT結(jié)構(gòu)的數(shù)據(jù); mmioRead(file1,(char*)&format,sizeof(PCMWAVEFORMAT));//獲取該結(jié)構(gòu)的數(shù)據(jù); if(format.wf.nChannels!=2)//判斷是否是立體聲聲音; { MessageBox("該聲音文件不是雙通道立體聲文件"); return NULL; } mmioSeek(file1,24+sizeof(PCMWAVEFORMAT),SEEK_SET); //獲取WAVE文件的聲音數(shù)據(jù)的大小; long size; mmioRead(file1,(char*)&size,4); BYTE *pData; pData=(BYTE*)new char[size];//根據(jù)數(shù)據(jù)的大小申請緩沖區(qū); mmioSeek(file1,28+sizeof(PCMWAVEFORMAT),SEEK_SET);//對文件重新定位; mmioRead(file1,(char*)pData,size);//讀取聲音數(shù)據(jù); mmioClose(file1, MMIO_FHOPEN);//關(guān)閉WAVE文件; return pData; } |
浙公網(wǎng)安備 33010602011771號