使用MCI方法操作声音文件
生活随笔
收集整理的這篇文章主要介紹了
使用MCI方法操作声音文件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
引入:Winmm.lib????? Mmsystem.hBYTE* CWaveDlg::GetData(CString pString) //獲取聲音文件數據的函數,pString參數指向要打開的聲音文件;{?if (pString.IsEmpty())??return NULL;?HMMIO file;//定義HMMIO文件句柄;?file=mmioOpen(pString.GetBuffer(0),NULL,MMIO_READWRITE);//以讀寫模式打開所給的WAVE文件;?if(file==NULL)?{??MessageBox("WAVE文件打開失敗!");??return NULL;?}?char style[4];//定義一個四字節的數據,用來存放文件的類型;?mmioSeek(file,8,SEEK_SET);//定位到WAVE文件的類型位置?mmioRead(file,style,4);?if(style[0]!='W'||style[1]!='A'||style[2]!='V'||style[3]!='E')//判斷該文件是否為"WAVE"文件格式?{??MessageBox("該文件不是WAVE格式的文件!");??return NULL;?}?PCMWAVEFORMAT format; //定義PCMWAVEFORMAT結構對象,用來判斷WAVE文件格式;?mmioSeek(file,20,SEEK_SET);//對打開的文件進行定位,此時指向WAVE文件的PCMWAVEFORMAT結構的數據;?mmioRead(file,(char*)&format,sizeof(PCMWAVEFORMAT));//獲取該結構的數據;?if(format.wf.nChannels!=2)//判斷是否是立體聲聲音;?{??MessageBox("該聲音文件不是雙通道立體聲文件");??return NULL;?}?int len=sizeof(PCMWAVEFORMAT);?mmioSeek(file,24+sizeof(PCMWAVEFORMAT)+20,SEEK_SET);?//獲取WAVE文件的聲音數據的大小;?long size;?mmioRead(file,(char*)&size,4);?BYTE *pData;?pData=(BYTE*)new char[size];//根據數據的大小申請緩沖區;?mmioSeek(file,28+sizeof(PCMWAVEFORMAT)+20,SEEK_SET);//對文件重新定位;?mmioRead(file,(char*)pData,size);//讀取聲音數據;?mmioClose(file, MMIO_FHOPEN);//關閉WAVE文件;?return pData;}//播放用mcivoid CWaveDlg::OnOK() {?// TODO: Add extra validation here?MCI_OPEN_PARMS mciOpenParms;?MCI_PLAY_PARMS PlayParms;?mciOpenParms.dwCallback=0;?mciOpenParms.lpstrElementName="D://temp//for test//Wave//ent36871.wav";?mciOpenParms.wDeviceID=0;?mciOpenParms.lpstrDeviceType="waveaudio";?mciOpenParms.lpstrAlias=" ";?PlayParms.dwCallback=0;?PlayParms.dwTo=0;?PlayParms.dwFrom=0;?mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&mciOpenParms);//打開音頻設備;?mciSendCommand(mciOpenParms.wDeviceID,MCI_PLAY,MCI_WAIT,(DWORD)(LPVOID)&PlayParms);//播放WAVE聲音文件;?mciSendCommand(mciOpenParms.wDeviceID,MCI_CLOSE,NULL,NULL);//關閉音頻設備;?//CDialog::OnOK();}
總結
以上是生活随笔為你收集整理的使用MCI方法操作声音文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ms speech sdk51 TTS使
- 下一篇: 盛世吗