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