WAV文件的信息包括:采样率,比特率之类的。

解决方案 »

  1.   

    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);      // 处理所读得的数据    .