RIFF格式声音文件的实现(转)
摘要:本文簡(jiǎn)述RIFF格式聲音文件的構(gòu)成,通過(guò)調(diào)用多媒體文件I/O的三個(gè)重要函數(shù)及WAVEFormatX結(jié)構(gòu)數(shù)據(jù)的使用方法來(lái)實(shí)例闡述RIFF格式聲音文件的實(shí)現(xiàn)過(guò)程。
關(guān)鍵詞:RIFF[資源交換文件]格式 函數(shù) 結(jié)構(gòu)數(shù)據(jù)
聲音是多媒體的一個(gè)重要組成部份,在應(yīng)用程序中加入聲音能使系統(tǒng)更增添人性和友好。RIFF是推薦使用的多媒體文件[聲音文件]的格式。下面我們就以包含兩個(gè)子塊的RIFF信息塊結(jié)構(gòu)的聲音為例,闡述將磁盤(pán)多媒體文件讀入內(nèi)存并找到波形音頻數(shù)據(jù)塊,再將音頻數(shù)據(jù)寫(xiě)上聲卡[播放]從而發(fā)出聲音的全過(guò)程。?
RIFF服務(wù)中有整套I/O函數(shù)來(lái)mmioOpen[打開(kāi)],mmioRead[讀],mmioWrite[寫(xiě)],mmioColse[關(guān)閉]多媒體文件并直接操作內(nèi)存緩沖區(qū)。下面我們就以BYTE* m_lpData;作為本文的音頻數(shù)據(jù)塊內(nèi)存緩沖區(qū)指針,通過(guò)將音頻數(shù)據(jù)讀入m_lpData內(nèi)存緩沖區(qū)中,然后將m_lpData所指的數(shù)據(jù)塊寫(xiě)上聲音設(shè)備來(lái)完成這次的聲音播放過(guò)程[實(shí)現(xiàn)]。
下面是一個(gè)父塊和兩個(gè)子塊的RIFF結(jié)構(gòu)圖
RIFF每個(gè)信息塊讀寫(xiě)操作需要用到的函數(shù)如下表所示。?
RIFF父塊 ID[RIFF] 用mmioFOURCC('W','A','V','E')獲得RIFF類型標(biāo)識(shí)符用mmioDescend()判斷是否打開(kāi)WAVE文件?
Size[RIFF]
Form Type[WAVE] FMT子塊?
ID[fmt] 用mmioFOURCC('f','m','t',)獲得FMT類型標(biāo)識(shí)符?
Size[fmt] 用mmioDescend()查找RIFF格式下[FMT]數(shù)據(jù)子塊?
Data[fmt] 用mmioRead()讀出WAVEFormatx結(jié)構(gòu)數(shù)據(jù)?
用mmioAscend(hmmio,&mmckinfoSubchnk,0)跳出“FMT”子塊
Data子塊 ID[data]用mmioFOURCC('d','a', 't', 'a',)獲得data類型標(biāo)識(shí)符?
Size[data] 用mmioDescend()查找RIFF格式下聲音數(shù)據(jù)子塊?
Data[聲音數(shù)據(jù)] 用mmioRead()讀出RIFF聲音數(shù)據(jù)塊到m_lpData
從上表中可以看出mmioFOURCC、mmioDescend、mmioRead這三個(gè)函數(shù)和WAVEFormatX結(jié)構(gòu)數(shù)據(jù)被經(jīng)常使用。mmioFOURCC、mmioDescend、mmioRead的使用如下:?
① mmioFOURCC('W','A','V','E')函數(shù)的原形定義如下:?
#define FOURCC_RIFF mmioFOURCC('R','I','F','F')?
② mmioDescend()函數(shù)的原形定義如下:?
WINAPI mmioDescend(HMMIO hmmio, //多媒體文件句柄由mmioOpen()傳來(lái)?
LPMMCKINFO pmmcki, //RIFF父塊和子塊結(jié)構(gòu)?
//RIFF父塊結(jié)構(gòu)查找父塊時(shí)設(shè)NULL?
const MMCKINFO FAR* pmmckiParent,?
//標(biāo)示符設(shè)為MMIO_FINDCHUNK用以發(fā)現(xiàn)塊?
UINT fuDescend);?
③ mmioRead()函數(shù)的原形定義如下:?
WINAPI mmioRead(HMMIO hmmio, //多媒體文件句柄由mmioOpen()傳來(lái)?
//數(shù)據(jù)結(jié)構(gòu)指針如WAVEFORMATEX結(jié)構(gòu)或BYTE指針?
HPSTR pch,?
LONG cch); //數(shù)據(jù)長(zhǎng)度?
還有一重要的函數(shù)原形即mmioOpen()打開(kāi)多媒體文件的函數(shù)原形定義如下:?
HMMIO WINAPI mmioOpenA(LPSTR pszFileName, //音頻文件的路徑及文件名?
LPMMIOINFO pmmioinfo,//多媒體文件的信息結(jié)構(gòu)?
DWORD fdwOpen); //打開(kāi)文件的方式如讀MMIO_READ?
//寫(xiě)MMIO_WRITE文件?
在使用函數(shù)時(shí),還需注意一些參數(shù)以便申請(qǐng)需要的變量。?
① HMMIO hmmio, //多媒體文件句柄?
如用hmmio=mmioOpen(“……”)正常打開(kāi)文件時(shí)返回句柄供后續(xù)函數(shù)用。?
② MMCKINFO mmckinfoParent; //信息塊結(jié)構(gòu)[設(shè)為父塊結(jié)構(gòu)變量]?
如:mmioDescend(hmmio,&mmckinfoParent,NULL,MMIO_FINDRIFF)//獲得父塊信息,將第三個(gè)參數(shù)設(shè)為NULL。?
③ MMCKINFO mmckinfoSubchunk; //信息塊結(jié)構(gòu)[設(shè)為子塊結(jié)構(gòu)變量]?
如:mmioDescend(hmmio,&mmckinfoSubchunk,&mmckinfoParent,MMIO_FINDCHUNK)// 獲得子塊信息,將子塊結(jié)構(gòu)放在第二參數(shù)中,將父塊結(jié)構(gòu)放到第三參數(shù)中用以查找到子塊信息。?
④ mmioRead()函數(shù)要用兩個(gè)參數(shù):[WAVEFORMATEX]、[BYTE],因其它函數(shù)都要用到,所以申請(qǐng)為“公有”變量在類的頭文件中。?
⑤ BYTE* m_lpData; //內(nèi)存音頻數(shù)據(jù)塊指針,用以指上內(nèi)存緩沖區(qū)聲音數(shù)據(jù)塊?
⑥ WAVEFORMATEX m_pFormat; //波形文件格式結(jié)構(gòu)
轉(zhuǎn)載于:https://www.cnblogs.com/lijihong/archive/2011/10/12/2208984.html
總結(jié)
以上是生活随笔為你收集整理的RIFF格式声音文件的实现(转)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 酸辣猪蹄的做法步骤,酸辣猪蹄怎么做好吃
- 下一篇: 投影仪灯泡价格大概是多少钱,如何选购投影