肯定有一个函数与他的声音波形相连,
看那些windows media play等等都有...

解决方案 »

  1.   

    网上应该有这样的源代码,是读去wav数据,然后根据每段的最大值和最小值来画的,有个比例的问题,就是从多少点中去取最大点和最小点,为了加快速度,还需要缓存的。应该不难的呀。
      

  2.   

    详见MSDN - Media 开发
      

  3.   

    具体是怎样读出wav文件的数据?
      

  4.   

                      HMMIO hmmio; // 文件句柄

    MMCKINFO mmckinfoParent; // 父块信息

    MMCKINFO mmckinfoSubchunk; // 子块信息

    DWORD dwFmtSize; // “fmt”数据块的大小 

    DWORD dwDataSize; // “data”数据块的大小

    WAVEFORMAT *pFormat; // “fmt”数据块的地址

    HPSTR lpData; // “data”数据块的地址

    // 获取WAVE文件名

    // 以内部缓冲区方式打开文件

    if(!(hmmio = mmioOpen("C:\\WINDOWS\\Media\\chimes.wav",NULL,MMIO_READ | MMIO_ALLOCBUF))) 
    {
    // 打开文件出错,错误处理
    AfxMessageBox("Open file Error!");
    return; 


    // 寻找形式类型为“WAVE”的“RIFF”数据块,以确定文件为WAVE文件

    mmckinfoParent.fccType = mmioFOURCC('W', 'A', 'V', ' '); 

    if (mmioDescend(hmmio, (LPMMCKINFO) &mmckinfoParent, NULL,  MMIO_FINDRIFF)) 

    // 文件不是WAVE文件,错误处理
    AfxMessageBox("not a wav file!");
    mmioClose(hmmio, 0); 
    return; 



    // 寻找RIFF数据块的“fmt”子块 

    mmckinfoSubchunk.ckid = mmioFOURCC('f', 'm', 't', ' '); 

    if (mmioDescend(hmmio, &mmckinfoSubchunk, &mmckinfoParent, MMIO_FINDCHUNK)) 

    // 不能找到“fmt”子块,错误处理
    AfxMessageBox("can't find fmt chunk!");
    mmioClose(hmmio, 0); 
    return; 

    // 获取“fmt”子块的大小,并分配内存
    dwFmtSize = mmckinfoSubchunk.cksize; 
    // 读取“fmt”子块数据
    if (mmioRead(hmmio, (HPSTR) pFormat, dwFmtSize) != dwFmtSize)

    // 读“fmt”子块数据出错,错误处理
    AfxMessageBox("Read fmt chunk Error!");
    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”子块,错误处理
    AfxMessageBox("can't find date chunk!");
    mmioClose(hmmio, 0); 
    return; 

    // 获取“data”子块的大小
    dwDataSize = mmckinfoSubchunk.cksize; 
    if (dwDataSize == 0L)

    // “data”子块中无数据,错误处理
    AfxMessageBox("nothing in data chunk!");
    mmioClose(hmmio, 0); 
    return; 


    // 打开WAVE输出设备


    // 为WAVE数据分配并锁定内存 

    // 读出WAVE数据子块 
    if(mmioRead(hmmio, (HPSTR) lpData, dwDataSize) != dwDataSize)

    // 读“data”子块数据出错,错误处理
    AfxMessageBox("Read data chunk Error!");
    mmioClose(hmmio, 0); 
    return; 
    }
    // 关闭文件
    mmioClose(hmmio, 0);
      

  5.   

    直接解析wav文档
     char        szFileName[128];    // filename of file to open 
        HMMIO       hmmio;              // file handle for open file 
        MMCKINFO    mmckinfoParent;     // parent chunk information 
        MMCKINFO    mmckinfoSubchunk;   // subchunk information structure 
        DWORD       dwFmtSize;          // size of "FMT" chunk 
        DWORD       dwDataSize;         // size of "DATA" chunk 
        WAVEFORMAT  *pFormat;           // address of "FMT" chunk 
        HPSTR       lpData;             // address of "DATA" chunk 
     
        // Get the filename from the edit control. 
        . 
        . 
        . 
        // Open the file for reading with buffered I/O 
        // by using the default internal buffer 
        if(!(hmmio = mmioOpen(szFileName, NULL, 
            MMIO_READ | MMIO_ALLOCBUF))) 
        { 
            Error("Failed to open file."); 
            return; 
        } 
     
        // Locate a "RIFF" chunk with a "WAVE" form type to make 
        // sure the file is a waveform-audio file. 
        mmckinfoParent.fccType = mmioFOURCC('W', 'A', 'V', 'E'); 
        if (mmioDescend(hmmio, (LPMMCKINFO) &mmckinfoParent, NULL, 
            MMIO_FINDRIFF)) 
        { 
            Error("This is not a waveform-audio file."); 
            mmioClose(hmmio, 0); 
            return; 
        } 
        // Find the "FMT" chunk (form type "FMT"); it must be 
        // a subchunk of the "RIFF" chunk. 
        mmckinfoSubchunk.ckid = mmioFOURCC('f', 'm', 't', ' '); 
        if (mmioDescend(hmmio, &mmckinfoSubchunk, &mmckinfoParent, 
            MMIO_FINDCHUNK)) 
        { 
            Error("Waveform-audio file has no "FMT" chunk."); 
            mmioClose(hmmio, 0); 
            return; 
        } 
     
        // Get the size of the "FMT" chunk. Allocate 
        // and lock memory for it. 
        dwFmtSize = mmckinfoSubchunk.cksize; 
        . 
        . 
        . 
        // Read the "FMT" chunk. 
        if (mmioRead(hmmio, (HPSTR) pFormat, dwFmtSize) != dwFmtSize){ 
            Error("Failed to read format chunk."); 
            . 
            . 
            . 
            mmioClose(hmmio, 0); 
            return; 
        } 
      

  6.   

    VC读取WAV文件的信息需要建一个什么工程啊  加些什么库文件?能不能具体说一下,我刚接触什么都不会,请帮帮小忙吧!!!
      

  7.   

    我也在研究mmio系列函数,问一下mmioDescend的返回值应该是什么,返回0是wav文件还是不是0是wav函数
      

  8.   

    WAVE还算是比较好分析的音频。
      

  9.   

    太难的我也不会,需要加
    #include    <windows.h>
    #pragma   comment(lib,"winmm.lib")  
    #include   <mmsystem.h>
    这些头文件,我做的是根据一个wav文件创建一个wav文件,所以建一个控制台程序就行了
      

  10.   

    还有我想问一下8楼,楼主只要读出数据,所以为什么还用mmioDescend一个fmt,fmt是必须的过程吗,新手也在学习中,另外这一句的作用是mmioRead(hmmio,   (HPSTR)   pFormat,   dwFmtSize)   !=   dwFmtSize什么呀