摘要:本文简述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格式声音文件的实现(转)相关推荐

  1. 构建PCM格式WAV声音文件

    WAV声音文件是Windows系统早期就开始使用的一种声音文件格式,可以包含多种音频格式.其中PCM格式属于未压缩音频数据流,数据格式比较简单. 下面就生成PCM格式音频文件进行说明. PCM格式音频 ...

  2. Python标准库判断图片文件和声音文件的格式

    每种文件都有自己独特的文件头结构和数据组织形式,这些都会在specification中进行详细说明和描述. GIF文件的头结构比较简单,前4个字节是GIF8,例如: 但是其他图片文件的结构就复杂很多了 ...

  3. c# 使用System.Media.SoundPlayer播放wav格式的声音文件

    using System.Media;string szPath = Application.StartupPath + "\\SoundFile\\sound.wav"; Sou ...

  4. (原创)speex与wav格式音频文件的互相转换

    我们的司信项目又有了新的需求,就是要做会议室.然而需求却很纠结,要继续按照原来发语音消息那样的形式来实现这个会议的功能,还要实现语音播放的计时,暂停,语音的拼接,还要绘制频谱图等等. 如果是wav,m ...

  5. 使用MCI方法操作声音文件

    引入:Winmm.lib      Mmsystem.hBYTE* CWaveDlg::GetData(CString pString) //获取声音文件数据的函数,pString参数指向要打开的声音 ...

  6. 如何将Pcm格式的音频文件转换成Wave格式的文件

    最近在做一款变声App,其中就用到了将pcm格式转wave格式,下面贴出源代码,希望带有需求的童鞋有帮助!!!这里是c++语言写的,也可以用java实现.当然java调用native函数要用到jni技 ...

  7. m3u8解析_浅谈m3u8格式视频文件采集

    在对某在线视频网站抓包分析时,发现该站点采用m3u8格式进行视频文件传输. 通过m3u8的response可以看到,m3u8格式文件由很多段ts文件组成.那么什么是m3u8,什么是ts呢? M3U8是 ...

  8. iPhone 播放音频声音文件

    播放音频声音文件 iphone开发中播放声音文件主要使用AVAudioPlayer 类,它的功能非常强大支持播放音频的格式也非常的多,我们可以把它看成一个高级的音乐播放器,它支持的播放格式有 ■ AA ...

  9. python不用模块调用麦克风_python调用pyaudio使用麦克风录制wav声音文件的教程

    python的pyaudio可以进行录音,播放,生成wav文件等等,WAVE是录音时用的标准的WINDOWS文件格式,文件的扩展名为WAV,数据本身的格式为PCM或压缩型,属于无损音乐格式的一种.在我 ...

最新文章

  1. java方法里执行两条sql_Java如何在数据库上执行多个SQL命令?
  2. 敏捷、精益、六西格玛之间到底有什么差异?
  3. 牛客华为机试第8题python
  4. 用云闪付乘坐公交地铁,能否享受到优惠,取决于这一点
  5. 搞硬件,钱少破事多,只能另谋出路!
  6. Android开发笔记(五十八)铃声与震动
  7. 关于C#_ArrayList的两篇文章
  8. SPOJ Play on Words
  9. 学习Samba基础命令详解之大话西游01
  10. 单片微型计算机第三版课后习题答案,单片微型计算机原理与应用_课后习题答案_山东理工.docx...
  11. 陈计老师《代数不等式》p15例6的别证
  12. 在计算机编程里pi是什么意思,编程中的术语“钩子”是什么意思?
  13. HackTheBox-Chaos-CTF_解题过程
  14. css样式的补充:鼠标悬停字体变大和改变颜色
  15. 代采供应链金融系统-完整实现境内外采购业务的运营和管理
  16. spring boot 中用到的thymeleaf (模板引擎)
  17. ubuntu 16.04可以连接wifi,不能上网问题
  18. 17个练习自动化测试的网站,相信你一定喜欢
  19. TMO (time-triggered message-triggered object)
  20. ESP32 测试(十):ESP32 Wi-Fi 和 蓝牙 并存时开始睡眠模式的电流功耗

热门文章

  1. java强引用弱引用_Java 的强引用、弱引用、软引用、虚引用
  2. step如何打开服务器项目,STEP7项目打开及删除
  3. 成本预算的四个步骤_干货!如何做好年度培训计划中的预算工作
  4. MySQL面试题 | 附答案解析(十六)
  5. Java实现无向图的邻接列表表示,深度遍历及广度遍历
  6. 为什么不推荐使用汉字作为密码?
  7. raw格式图片读取与显示C++,opencv
  8. 数字图像处理——第七章 小波和多分辨处理
  9. CornerNet:实现demo、可视化heatmap、测试各类别精度
  10. TANDEM 基于深度多视图立体视觉的实时跟踪和稠密建图