日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

RIFF格式声音文件的实现(转)

發布時間:2023/11/27 生活经验 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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格式声音文件的实现(转)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。