MFC中如何比较两个已有的.wav文件是否相同,我是初学者,真不知道从何入手,请高手指点,谢谢!~

解决方案 »

  1.   

    如果wav文件比较大,建议还是用MD5生成的消息摘要来辨别是否相同。这样效率较高。
    比较文件修改时间不太可靠,因为两个不同文件的最后修改时间也可能相同,而且文件的修改时间是可以更改的。
      

  2.   

    MFC如何可以把文件读到buffer啊?
    下面这个是C++ Builder6的一段loadWaveToBuf的code.
    int Tmainform::LoadWaveToBuf(AnsiString waveFileName, short ** buff)
    {
      FILE *fp ;
      short *macBuf ;
      fp = fopen(waveFileName.c_str(),"rb") ;
      if (fp == NULL)
        return 0 ;
      WAVEHEADER waveHeader ;
      fread(&waveHeader,sizeof(WAVEHEADER),1,fp);  int posStart,posEnd ;
      posStart = ftell(fp) ;
      fseek(fp,0,SEEK_END) ;
      posEnd = ftell(fp);
      macBuf = (short *)malloc(posEnd-posStart+1) ;
      fseek(fp,posStart, SEEK_SET) ;
      fread(macBuf,posEnd-posStart,1,fp);
      *buff = macBuf ;
      fclose(fp);
      wBytePerSample = waveHeader.u.nBitsPerSample/8 ;
      int iRtnSize = (posEnd-posStart)/wBytePerSample;  //check wave
      int iSampleEqualCnt = 0 ;
      short value = 0;
      for (int I = 0; I < iRtnSize; I++)
      {
        if (value == macBuf[I])
        {
          iSampleEqualCnt++ ;
        }
        else
        {
          iSampleEqualCnt = 0 ;
          value = macBuf[I] ;
        }
        #if 0
        if (iSampleEqualCnt >= SAMPLE_EQUAL_MAX)
        {
          if (abs(value) > 32760)
            ShowMessage("Your volume is too large, maybe have errors") ;
          else if (abs(value) < 100)
            ShowMessage("Your volume is too small") ;
          break;
        }
        #endif
      }  return (iRtnSize) ;
    }
    我把它搬到MFC上,可是运行到For循环,运行一定的次数后,程序就会死掉退出,请问是不是不能这样直接把代码搬过来啊?能否告诉我用MFC如何可以load wave文件到buffer中啊?谢谢!~
    int CAudioDataCtrl::LoadWaveToBuf(CString waveFileName, short ** buff)
    {
      FILE *fp ;
      short *macBuf ;  CString temp;
      AfxMessageBox(waveFileName);    const char * CharWaveFileName=(LPSTR)(LPCTSTR)waveFileName;
         
       fp = fopen(CharWaveFileName,"rb") ;
      if (fp == NULL)
      
        return 0 ;
      
      WAVEHEADER waveHeader ;
      fread(&waveHeader,sizeof(WAVEHEADER),1,fp);  int posStart,posEnd ;
      posStart = ftell(fp) ;
      
      fseek(fp,0,SEEK_END) ;
      posEnd = ftell(fp);  macBuf = (short *)malloc(posEnd-posStart+1) ;
      fseek(fp,posStart, SEEK_SET) ;
      fread(macBuf,posEnd-posStart,1,fp);
      *buff = macBuf ;
      fclose(fp);
      wBytePerSample = waveHeader.u.nBitsPerSample/8 ;
      int iRtnSize = (posEnd-posStart)/wBytePerSample;
       //check wave
      int iSampleEqualCnt = 0 ;
      short value = 0;
      for (int I = 0; I < iRtnSize; I++)
      {
        if (value == macBuf[I])
        {
          iSampleEqualCnt++ ;
        }
        else
        {      iSampleEqualCnt = 0 ;
          value = macBuf[I] ;
        }
        #if 0
        if (iSampleEqualCnt >= SAMPLE_EQUAL_MAX)
        {
          if (abs(value) > 32760)
            AfxMessageBox("Your volume is too large, maybe have errors") ;
          else if (abs(value) < 100)
            AfxMessageBox("Your volume is too small") ;
          break;
        }
        #endif
      }
    AfxMessageBox("test");
      return (iRtnSize) ;
    }
      

  3.   

    不是比较完全相同,只要在一定的范围内都算相同。
    比如我播放同一个.wav文件,两次都从播放多长时间后开始录,录相同时间。
    因开始录制的时间不一定完全相同,我还要去找同步点,然后再进行比较,波形变化在一定范围内,都算这两个录制的wav文件相同。
      

  4.   

    照这样你根本不是要比较WAV文件,而是要比较语音.
    语音识别???
    那不如用MS现存的库吧.自己开发效率.......
      

  5.   

    现在我录有两个.wav文件,那用MS现存的库,具体该怎么去比较语音文件(.wav)?能说详细点吗?我是初学者,让你见笑了。谢谢。
      

  6.   

    那得做波形分析,网上有相关的wav波形分析的源代码,可以搜搜看看。
    这有一个vb的:http://www.landong.com/down/soft/1944.htm