如何用VC读取WAV文件的信息? WAV文件的信息包括:采样率,比特率之类的。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 RIFF文件,有标准操作方法下面的代码举例说明了寻找形式类型为“WAVE”的RIFF数据块,以判断RIFF文件是否为WAVE文件。如是WAVE文件,则进一步寻找ID为“fmt ”的数据块:HMMIO hmmio; MMCKINFO mmckinfoParent; MMCKINFO mmckinfoSubchunk; . . . mmckinfoParent.fccType = mmioFOURCC('W', 'A', 'V', 'E'); if (mmioDescend(hmmio, (LPMMCKINFO) &mmckinfoParent, NULL, MMIO_FINDRIFF)) { // 文件不是WAVE文件 . . . }else {// 文件是WAVE文件// 寻找“fmt ”子块mmckinfoSubchunk.ckid = mmioFOURCC('f', 'm', 't', ' '); if (mmioDescend(hmmio, &mmckinfoSubchunk, &mmckinfoParent, MMIO_FINDCHUNK)) {// 出错,不能找到“fmt”子块...}else {// 找到“fmt”子块...} }在进入下一层数据块并完成相应的操作后,可调用mmioAscend函数返回上一层数据块,将文件指针移到下一个数据块的开始位置。mmioAscend的函数原型如下:MMRESULT mmioAscend( HMMIO hmmio, LPMMCKINFO lpck, UINT wFlags );其中wFlags参数被保留,应设为0。下面的代码演示了打开、遍历WAVE文件及读出数据块的方法。 char szFileName[256]; // 文件名 HMMIO hmmio; // 文件句柄 MMCKINFO mmckinfoParent; // 父块信息 MMCKINFO mmckinfoSubchunk; // 子块信息 DWORD dwFmtSize; // “fmt”数据块的大小 DWORD dwDataSize; // “data”数据块的大小 WAVEFORMAT *pFormat; // “fmt”数据块的地址 HPSTR lpData; // “data”数据块的地址 // 获取WAVE文件名 . . . // 以内部缓冲区方式打开文件 if(!(hmmio = mmioOpen(szFileName, NULL, MMIO_READ | MMIO_ALLOCBUF))) { // 打开文件出错,错误处理 return; } // 寻找形式类型为“WAVE”的“RIFF”数据块,以确定文件为WAVE文件 mmckinfoParent.fccType = mmioFOURCC('W', 'A', 'V', 'E'); if (mmioDescend(hmmio, (LPMMCKINFO) &mmckinfoParent, NULL, MMIO_FINDRIFF)) { // 文件不是WAVE文件,错误处理 mmioClose(hmmio, 0); return; } // 寻找RIFF数据块的“fmt”子块 mmckinfoSubchunk.ckid = mmioFOURCC('f', 'm', 't', ' '); if (mmioDescend(hmmio, &mmckinfoSubchunk, &mmckinfoParent, MMIO_FINDCHUNK)) { // 不能找到“fmt”子块,错误处理 mmioClose(hmmio, 0); return; } // 获取“fmt”子块的大小,并分配内存 dwFmtSize = mmckinfoSubchunk.cksize; . . . // 读取“fmt”子块数据 if (mmioRead(hmmio, (HPSTR) pFormat, dwFmtSize) != dwFmtSize){ // 读“fmt”子块数据出错,错误处理 . . . mmioClose(hmmio, 0); return; } // 移出“fmt”子块 mmioAscend(hmmio, &mmckinfoSubchunk 0); // 寻找“data”子块 // 当前文件位置应该是“data”子块的起始位置 mmckinfoSubchunk.ckid = mmioFOURCC('d', 'a', 't', 'a'); if (mmioDescend(hmmio, &mmckinfoSubchunk, &mmckinfoParent, MMIO_FINDCHUNK)) { // 不能找到“data”子块,错误处理 . . . mmioClose(hmmio, 0); return; } // 获取“data”子块的大小 dwDataSize = mmckinfoSubchunk.cksize; if (dwDataSize == 0L){ // “data”子块中无数据,错误处理 . . . mmioClose(hmmio, 0); return; } // 打开WAVE输出设备 . . . // 为WAVE数据分配并锁定内存 . . . // 读出WAVE数据子块 if(mmioRead(hmmio, (HPSTR) lpData, dwDataSize) != dwDataSize){ // 读“data”子块数据出错,错误处理 . . . mmioClose(hmmio, 0); return; } // 关闭文件 mmioClose(hmmio, 0); // 处理所读得的数据 . office文档格式解析 doc 先来有分,后来后悔——不可错过的学习C语言的经典详细教程 向同一个对话框发送两个自定义消息,这两个消息是否会按顺序执行 mfc中??? 求用ctreectrl显示二叉树结构的源代码,重谢 vc ado 查询数据库 类型转换 VC 6 调试时监视某个字符串的值如何让它显示全部?我这里只显示出前面一小段。 请问在单文档中怎么动态加入 picture 控制,那个类是什么? C++头文件的一个问题? SDK的基本问题——如何让DX绘图和窗口绘图同时进行? 急:ATL COM组件调用其他文件(dll)的问题! 两个wav如何合成? 读取WAV文件到内存
下面的代码举例说明了寻找形式类型为“WAVE”的RIFF数据块,以判断RIFF文件是否为WAVE文件。如是WAVE文件,则进一步寻找ID为“fmt ”的数据块:HMMIO hmmio; MMCKINFO mmckinfoParent; MMCKINFO mmckinfoSubchunk; . . . mmckinfoParent.fccType = mmioFOURCC('W', 'A', 'V', 'E'); if (mmioDescend(hmmio, (LPMMCKINFO) &mmckinfoParent, NULL, MMIO_FINDRIFF)) { // 文件不是WAVE文件 . . . }else {// 文件是WAVE文件// 寻找“fmt ”子块mmckinfoSubchunk.ckid = mmioFOURCC('f', 'm', 't', ' '); if (mmioDescend(hmmio, &mmckinfoSubchunk, &mmckinfoParent, MMIO_FINDCHUNK)) {// 出错,不能找到“fmt”子块...}else {// 找到“fmt”子块...} }在进入下一层数据块并完成相应的操作后,可调用mmioAscend函数返回上一层数据块,将文件指针移到下一个数据块的开始位置。mmioAscend的函数原型如下:MMRESULT mmioAscend( HMMIO hmmio, LPMMCKINFO lpck, UINT wFlags );其中wFlags参数被保留,应设为0。下面的代码演示了打开、遍历WAVE文件及读出数据块的方法。 char szFileName[256]; // 文件名 HMMIO hmmio; // 文件句柄 MMCKINFO mmckinfoParent; // 父块信息 MMCKINFO mmckinfoSubchunk; // 子块信息 DWORD dwFmtSize; // “fmt”数据块的大小 DWORD dwDataSize; // “data”数据块的大小 WAVEFORMAT *pFormat; // “fmt”数据块的地址 HPSTR lpData; // “data”数据块的地址 // 获取WAVE文件名 . . . // 以内部缓冲区方式打开文件 if(!(hmmio = mmioOpen(szFileName, NULL, MMIO_READ | MMIO_ALLOCBUF))) { // 打开文件出错,错误处理 return; } // 寻找形式类型为“WAVE”的“RIFF”数据块,以确定文件为WAVE文件 mmckinfoParent.fccType = mmioFOURCC('W', 'A', 'V', 'E'); if (mmioDescend(hmmio, (LPMMCKINFO) &mmckinfoParent, NULL, MMIO_FINDRIFF)) { // 文件不是WAVE文件,错误处理 mmioClose(hmmio, 0); return; } // 寻找RIFF数据块的“fmt”子块 mmckinfoSubchunk.ckid = mmioFOURCC('f', 'm', 't', ' '); if (mmioDescend(hmmio, &mmckinfoSubchunk, &mmckinfoParent, MMIO_FINDCHUNK)) { // 不能找到“fmt”子块,错误处理 mmioClose(hmmio, 0); return; } // 获取“fmt”子块的大小,并分配内存 dwFmtSize = mmckinfoSubchunk.cksize; . . . // 读取“fmt”子块数据 if (mmioRead(hmmio, (HPSTR) pFormat, dwFmtSize) != dwFmtSize){ // 读“fmt”子块数据出错,错误处理 . . . mmioClose(hmmio, 0); return; } // 移出“fmt”子块 mmioAscend(hmmio, &mmckinfoSubchunk 0); // 寻找“data”子块 // 当前文件位置应该是“data”子块的起始位置 mmckinfoSubchunk.ckid = mmioFOURCC('d', 'a', 't', 'a'); if (mmioDescend(hmmio, &mmckinfoSubchunk, &mmckinfoParent, MMIO_FINDCHUNK)) { // 不能找到“data”子块,错误处理 . . . mmioClose(hmmio, 0); return; } // 获取“data”子块的大小 dwDataSize = mmckinfoSubchunk.cksize; if (dwDataSize == 0L){ // “data”子块中无数据,错误处理 . . . mmioClose(hmmio, 0); return; } // 打开WAVE输出设备 . . . // 为WAVE数据分配并锁定内存 . . . // 读出WAVE数据子块 if(mmioRead(hmmio, (HPSTR) lpData, dwDataSize) != dwDataSize){ // 读“data”子块数据出错,错误处理 . . . mmioClose(hmmio, 0); return; } // 关闭文件 mmioClose(hmmio, 0); // 处理所读得的数据 .