zoukankan      html  css  js  c++  java
  • 基于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);

    版权申明:本站文章均来自网络,如有侵权,请评论 ,收到后立即删除,谢谢! 

  • 相关阅读:
    [刘阳Java]_eayui-pagination分页组件_第5讲
    [刘阳Java]_easyui-draggable拖动组件_第4讲
    [刘阳Java]_easyui-panel组件入门级_第3讲
    [刘阳Java]_TortoiseSVN基础应用_第1讲
    [刘阳Java]_SpringMVC文件上传第2季_第11讲
    [刘阳Java]_Spring中IntrospectorCleanupListener的用途【补充】_第16讲
    使用fetch代替ajax请求 post传递方式
    react购物车demo
    react-redux异步数据操作
    redux模块化demo
  • 原文地址:https://www.cnblogs.com/wanghoney/p/3450396.html
Copyright © 2011-2022 走看看