当前位置: 首页 > 编程日记 > 正文

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

相关文章:

使用PermissionsDispatcher轻松解决Android权限问题

之前也处理过6.0后的权限问题,直接处理很是麻烦。这次在github上搜到了关于权限星数最多的PermissionsDispatcher这个库,几个注释完美解决权限问题。 第一步 添加各种注释 1.RuntimePermissions 注释在需要权限的Activity和Fragment RuntimePermissions …

什么人适合学习web前端?怎样学好web前端开发?

web前端在IT互联网行业的发展前景是非常可观的,越来越多的人都在学习web前端技术,那么什么人适合学习web前端?怎样学好web前端开发?相信大家都想了解这些问题,我们来看看下面的详细介绍。 什么人适合学习web前端?怎样学好web前端开发? 一…

浏览器缓存导致FLASH资源更新问题的解决方案

在网上搜浏览器缓存问题时,遇上了很多问题。一是不知道应该用何种关键字搜索,二是一搜出来,就全是讲的是如何禁用浏览器缓存的方案。 作为大型点的FLASH WEBGAME来说,不缓存显然是不行的。总体上来说,我们要想达到的目…

技术图文:Python的属性装饰器详解

背景 我们在以前的一篇图文 Python基础 – Task10. 类与对象 中介绍过利用property()方法既能保护类的封装特性,又能让开发者可以使用“对象.属性”的方式操作类属性。 class property([fget[, fset[, fdel[, doc]]]])用于在新式类中返回属性值。 fget – 获取属…

又一个强大的PHP5.3依赖注入容器

简单的服务容器 一个简单的 php 5.3 依赖注入容器。 项目地址:https://github.com/godruoyi/easy-container Why 目前比较流行的 PHP 容器: PimpleLaravel Container其他依赖注入容器Pimple 是一个简单优秀的 php 5.3 容器,也是目前用得最多的…

软件测试培训:如何搭建测试环境

如何搭建测试环境?这是很多测试人员都需要了解的,测试是每个产品上线前必备的一个检验,不管是什么产品,做好有效的测试是对产品质量的一个负责,软件测试环境要考虑的就是软件在什么软硬件下能正常运行,什么环境下不能…

技术图文:如何爬取一个地区的气象数据(上)?

背景 架空线路主要指架空明线,架设在地面之上,是用绝缘子将输电导线固定在直立于地面的杆塔上以传输电能的输电线路。架设及维修比较方便,成本较低,但容易受到气象和环境(如大风、雷击、污秽、冰雪等)的影…

C#按关闭按钮实现最小化,按ESC才关闭的实现【含系统消息大全】

protected override void WndProc(ref Message m) { const int WM_SYSCOMMAND 0x0112; const int SC_CLOSE 0xF060; if (m.Msg WM_SYSCOMMAND && (int)m.WParam SC_CLOSE) { // 屏蔽传入的消息事件 …

眠眠interview Question

1. Wkwebkit在异步回调 如何像webview的回调 一样在主线程回调。可以使用runloop 解决么? dispatch get main queue http://www.jianshu.com/p/a2fc399075e0 转载于:https://www.cnblogs.com/tufei7/p/7657617.html

哪些人适合参加软件测试培训

软件测试是现在很多企业需求都非常大的一个岗位,只要是互联网行业基本都是有需求的,那么想要学习软件测试,哪些人适合参加软件测试培训呢?来看看下面的详细介绍。 哪些人适合参加软件测试培训? 想从零开始进入软件技术行业 软件测试的优势是…

从iso镜像升级ubuntu

步骤: 1.从网上下载Alternate版本的ISO镜像 2.加载ubuntu镜像 # mount -t iso9660 -o loop ubuntu-11.10-alternate-i386.iso /mnt/cdrom/3.进入/mnt/cdrom/ 运行cdromupgrade 程序 # cd /mnt/cdrom/ # ./cdromupgrade转载于:https://www.cnblogs.com/dudp/archive…

技术图文:如何爬取一个地区的气象数据(下)?

背景 架空线路常见的故障有:风偏闪络故障、雷击跳闸故障、雷击断股故障、线路覆冰故障、线路污闪故障、线路外力破坏故障、线路鸟害故障等等。从这些故障中,我们可以看出天气对线路的安全运行起到非常重要的作用。 在上一篇图文 如何爬取一个地区的气象…

Android :landscape||portrait 切换

可在AndroidManifest.xml里面配置屏幕发现。 在<Activity>中加入这一行android:screenOrientation"landscape/portrait " android中每次屏幕的切换动会重启Activity&#xff08;可以在Activity销毁前保存当前活动的状态&#xff0c;在Activity再次Create的时候…

web前端开发培训完就业前景怎么样

很多人都在学习web前端技术&#xff0c;认为学好这一项编程技术&#xff0c;找工作是非常稳定的&#xff0c;那么到底web前端开发培训完就业前景怎么样呢?来看看下面的详细介绍就知道了。 web前端开发培训完就业前景怎么样? web前端薪资待遇 从图中我们能够看到web前端从业者…

技术图文:如何改进算法的运行效率?

背景 前段时间&#xff0c;一位好友发给我如下的文件&#xff1a; 每个CSV文件中的数据由三个属性组成&#xff0c;第一个属性为ID&#xff0c;第二个属性为X坐标&#xff0c;第三个属性为Y坐标。由于是二维数据&#xff0c;可以绘制出每个文件的散点图&#xff0c;把这些散点…

B树,B+树,B-树和B*树

B树 即二叉搜索树&#xff1a; 1.所有非叶子结点至多拥有两个儿子&#xff08;Left和Right&#xff09;&#xff1b; 2.所有结点存储一个关键字&#xff1b; 3.非叶子结点的左指针指向小于其关键字的子树&#xff0c;右指针指向大于其关键字的子树&#xff1b; 如&#xff1a; …

JS对象直接量,数组直接量和函数直接量

对象直接量创建一个对象&#xff1a; var obj {x:[1,2],y:23}; 代码跟下面是一样的。 var objnew Object(); obj.xnew Array(1,2); obj.y23; 测试&#xff1a;for(var i in obj) alert(obj[i]); 函数直接量&#xff1a;它是一个表达式而不是语句。 (function(){})() 如下例&am…

学习Java编程培训的书籍有哪些

学习java技术除了线上线下的培训学习&#xff0c;书籍的知识也是非常重要的&#xff0c;今天小编为大家整理的就是学习Java的一些书籍&#xff0c;Java书籍是程序员学习提升技能的重要学习渠道&#xff0c;通过书籍Java程序员可以学习当前流行、重要的相关技能。下面我们一起来…

Datawhale组队学习:数据结构与算法课程任务

背景 Datawhale 是国内很有名的一个开源学习组织。这个组织将渴望改变的学习者以及一群有能力有想法的青年人集结在一起&#xff0c;营造出一种互促高效的学习环境&#xff0c;一起为开源学习付出努力。 Datawhale 近期将推出三门课程的组队学习。我先将 数据结构与算法&…

live555学习笔记2-基础类

二 基础类 讲几个重要的基础类&#xff1a; BasicUsageEnvironment和UsageEnvironment中的类都是用于整个系统的基础功能类&#xff0e;比如UsageEnvironment代表了整个系统运行的环境&#xff0c;它提供了错误记录和错误报告的功能&#xff0c;无论哪一个类要输出错误&#x…

自己写的小工具集合

2019独角兽企业重金招聘Python工程师标准>>> 文件夹大小查看工具 用于查看文件夹下每个子文件和子文件夹的大小.以前想统计文件夹大小,只能点右键看属性,而且只能看到文总大小。这个小工具可以通过右键启动,而且能查看文件夹下所有文件和文件夹的大小. 以前用过类似…

哪些人适合学软件测试呢

软件测试是现在很多企业的一个刚需岗位&#xff0c;所以软件测试的发展前景是非常好的&#xff0c;想要了解哪些人适合学软件测试呢?来看看下面的详细介绍就知道了。 哪些人适合学软件测试呢? 1.无编程基础 测试的代码量仅为20%左右&#xff0c;无论是文科生还是非计算机专业…

javabean和EJB的区别

Java Bean 是可复用的组件&#xff0c;对Java Bean并没有严格的规范&#xff0c;理论上讲&#xff0c;任何一个Java类都可以是一个Bean。但通常情况下&#xff0c;由于Java Bean是被容器所创建(如Tomcat)的&#xff0c;所以Java Bean应具有一个无参的构造器&#xff0c;另外&am…

Datawhale组队学习:初级算法梳理课程任务

背景 Datawhale 是国内很有名的一个开源学习组织。这个组织将渴望改变的学习者以及一群有能力有想法的青年人集结在一起&#xff0c;营造出一种互促高效的学习环境&#xff0c;一起为开源学习付出努力。 Datawhale 近期将推出三门课程的组队学习。我先将 初级算法梳理 的任务…

CSS将长文字换行的方法 (转)

大家都知道连续的英文或数字能是容器被撑大&#xff0c;不能根据容器的大小自动换行&#xff0c;下面是 CSS如何将他们换行的方法&#xff01; 对于div 1.&#xff08;IE浏览器&#xff09;white-space:normal; word-break:break-all;这里前者是遵循标准。 #wrap{white-space:n…

学Java的软件哪些比较好用

很多java程序猿在工作的时候都会用一些辅助工具&#xff0c;辅助工具可以很好的帮助程序猿高效率的完成工作&#xff0c;那么具体学Java的软件哪些比较好用呢?来看看下面的详细介绍。 学Java的软件哪些比较好用? 1. Eclipse Eclipse做为一款开发源代码的Java扩展性开发平台&a…

DataTable的Compute功能详解

在为筛选器创建表达式时&#xff0c;用单引号将字符串括起来&#xff1a;"LastName Jones"下面的字符是特殊字符&#xff0c;如下面所解释的&#xff0c;如果它们用于列名称中&#xff0c;就必须进行转义&#xff1a;\n (newline)\t (tab)\r (carriage return)~()#\…

Datawhale第九期组队学习计划

Datawhale 组队学习 第九期Datawhale组队学习计划马上就要开始啦&#xff01; 这次共组织三个组队学习&#xff0c;涵盖了编程、机器学习理论以及动手实践的内容&#xff0c;大家可以按照需要选择参加。 数据结构与算法&#xff08;上&#xff09; 内容设计&#xff1a;光城…

Hibernate获取数据java.lang.StackOverflowError

原因&#xff1a;因为在重写toString()方法时&#xff0c;把关联的属性也放入到toString方法中了&#xff0c;去掉就可以了。 如&#xff1a;重写的toString方法中不能有关联关系IDCard属性idCard public class Person {private Integer id;private String name;private IDCard…

UI设计培训之UI设计系统知识

最近有很多小伙伴都在学习UI设计的相关知识&#xff0c;很多同学都是东边一学习一下&#xff0c;西边学习一下&#xff0c;根本没有明确的学习方法&#xff0c;对于这个问题小编为大家整理了一下学习UI设计的系统知识&#xff0c;一起看看吧! UI设计培训之UI设计系统知识&#…