基于VC的声音文件操作(五)
(六)读取波形文件的实例
1.打开文件后,可通过HMMO句柄获得文件中的波形部份:
MMCKINFO mmckinfo;
mmckinfo.fccType = mmioFOURCC('W','A','V','E');
mmioDescend(h, &mmckinfo, NULL, MMIO_FINDRIFF);
经上述调用,mmioDescend函数在句柄h所指向的文件中搜索构造类型为"WAVE"的块的信息,MMCKINFO结构用来接受波形部份信息,该函数调用时会通过检查MMCKINFO结构的fccType的数据来决定需要获得什么构造类型的信息,我们指定函数的wflags参数为MMIO_FINDRIFF,表示需要搜索"RIFF"块信息。
RIFF文件的块信息结构MMCKINFO的定义如下:
typedef struct
{
FOURCC ckid; // 记录块的标识
DWORD cksize; // 记录该块的数据长度,该长度不包含4字节的块标识长度
FOURCC fccType; // 记录块的类型
DWORD dwDataOffset; // 记录块数据成员的首地址距文件头的偏移量
DOWRD dwFlags; // 用来指定块的附加信息,一般为空或MMIO_DIRTY等标记
}MMCKINFO;
2. 得到波形部分的MMCKINFO结构指针后,下一步就是获得波形文件的信息部分:
MMCKINFO mmfmtckinfo;
mmfmtckinfo.ckid = mmioFOURCC('F','M','T',' ');
mmioDescend(h, &mmfmtckinfo, &mmckinfo, MMIO_FINDCHUNCK);
mmioDescend函数可以通过把"RIFF"块mmckinfo作为"父块",以块搜索块的方式搜索到构造类型为"fmt ";搜索到的块信息由mmfmtckinfo对象接受,MMIO_FINDCHUNCK标识表示搜索块信息;
MMCKINFO结构中的fccType成员为四字节数据,如果类型不满4个字符,应该往后面添加空格。
得到了fmt部分的MMCKINFO指针后需要通过mmfmtckinfo得到PCMWAVEFORMAT结构:
PCMWAVEROMAT wformat;
mmioRead(h, &wformat, mmfmtckinfo.cksize);
当文件指针指到多媒体文件的mmfmtckinfo部分,函数会自动搜索到需要读入的PCMWAVEFORMT结构首地址,并按首地址顺次向wformat填mmfmtckinfo.cksize大小的字符数。
3. 如果还需要得到波形文件的数据信息,也就是说,要得到data部分信息,也可以通过调用mmioDescend函数得以实现。实现的第一步使文件的当前位置退回到mmckinfo块的位置:
mmioAscend(h, &mmfmtckinfo, 0);
然后需要声明一个对象mmdatainfo,并把该对象的fccType成员设置为"data"类型。通过mmioDescend函数搜索到data部分的地址:
MMCKINFO mmdatainfo;
mmdatainfo.ckid = mmioFOURCC('d','a', 't', 'a');
mmioDescend(h, &mmdatainfo, &mmckinfo, MMIO_FINDCHUNK);
HGLOBAL hdata;
LPSTR pdata;
hdata = GlobalAlloc(GMEM_MOVEALBE, mmdatainfo.cksize);
pdata = (LPSTR)GlobalLock(hdata);
mmioRead(h, pdata, mmdatainfo.cksize);
版权申明:本站文章均来自网络,如有侵权,请评论 ,收到后立即删除,谢谢!
基于VC的声音文件操作(五)的更多相关文章
- 基于VC的声音文件操作(二)
(二)VC的声音操作 操作声音文件,也就是将WAVE文件打开获取其中的声音数据,根据所需要的声音数据处理算法,进行相应的数学运算,然后将结果重新存储与WAVE格式的文件中去:可以使用CFILE类来实现 ...
- 基于VC的声音文件操作(四)
(五)读取wav的实例 跟据WAVE文件的格式,实现了读取双声道立体声数据的例子如下: BYTE * GetData(Cstring *pString) //获取声音文件数据的函数,pString参数 ...
- 基于VC的声音文件操作(三)
(四)VC中相关的操作 1.mmioOpen 打开一个文件 Syntax MMIO mmioOpen( LPTSTR szFilename, LPMMIOINFO lpmmioinfo, DWORD ...
- 基于VC的声音文件操作(一)
(一)文件格式 1.RIFF文件结构和WAVE文件格式 Windows支持两种RIFF(Resource Interchange File Format,"资源交互文件格式")格式 ...
- C#中基于流的XML文件操作笔记
System.Xml.XmlReader和System.Xml.XmlWriters是两个抽象类,XmlReader提供了对于XML数据的快速,非缓存,只进模式的读取器,XmlWriter表示一个编写 ...
- 将声音文件加入VC
概述 VC++是微软公司开发的一个IDE(集成开发环境),换句话说,就是使用c++的一个开发平台.有些软件就是这个编出来的...另外还有VB,VF.只是使用不同语言...但是,VC++是Windows ...
- VC++文件操作之最全篇
一.剖析VC中的文件操作 各种关于文件的操作在程序设计中是十分常见,如果能对其各种操作都了如指掌,就可以根据实际情况找到最佳的解决方案,从而在较短的时间内编写出高效的代码,因而熟练的掌握文件操作是十分 ...
- CFile CStdioFile CArchive 文件操作之异同(详细)
两者的主要区别: 一. CFile类操作文件默认的是Binary模式,CStdioFile类操作文件默认的是Text模式. 在Binary模式下我们必须输入'\r\n',才能起到回车换行的效果, ...
- C++ builder的文件操作
在编程的过程中,文件的操作是一个经常用到的问题,在C++Builder中,可以使用多种方法对文件操作,下面我就按以下几个部分对此作详细介绍,就是:1.基于C的文件操作:2.基于C++的文件操作:3.基 ...
随机推荐
- sizeof 跟 strlen 的区别
1.参数 sizeof是c/c++ 中的一个操作符,其作用是返回对象或数据类型所占的内存字节数. 用法:sizeof(对象).sizeof 对象.sizeof(类型) 如果类型做参数,返回的是该类型所 ...
- python "yield"(转载)
转载地址:http://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/ 您可能听说过,带有 yield 的函数在 Python ...
- myeclipse10的激活
myeclipse 提醒了我好几天要激活,今天操作了下,出现的问题分享一下. 在激活工具里面没有找到cracker.jar,按照指导双击run.bat,但是打开之后闪一下就自动关闭了,不得其解.然后搜 ...
- 使用mysql 命令行,增加 ,删除 字段 并 设置默认值 及 非空
使用mysql 命令行,增加 ,删除 字段 并 设置默认值 及 非空 添加 alter table table_name add field_name field_type; 添加,并设置默认值,及非 ...
- php中ajax调用出错的问题
最近用一些php,客户的使用jquery ajax的时候经常报错 ajax报错内容:readyState:4 status:"OK",statusText:"OK&quo ...
- js面向对象,多种创建对象方法!
1.对象字面量. var clock={ hour:12, minute:10, second:10, showTime:function(){ alert(this.hour+":&quo ...
- Codeforces 586D. Phillip and Trains 搜索
D. Phillip and Trains time limit per test: 1 second memory limit per test :256 megabytes input: stan ...
- Shell文本处理 - 分割合并与过滤
sort分类操作 示例文件 Boys in Company C:HK:192:2192 Alien:HK:119:1982 The Hill:KL:63:2972 Aliens:HK:532:4892 ...
- 将List转换为二维数组(result)
result的数据结构为List<Map<String,Object>> //将List转换为二维数组String[][] String[][] z = new String[ ...
- SQL查询符合条件的记录的总数
1. select count(*) from table; //统计元组个数 2. select count(列名) from table; //统计一列中值的个数 3. select co ...