MFC中如何比较两个已有的.wav文件是否相同,急,谢谢!~ MFC中如何比较两个已有的.wav文件是否相同,我是初学者,真不知道从何入手,请高手指点,谢谢!~ 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果wav文件比较大,建议还是用MD5生成的消息摘要来辨别是否相同。这样效率较高。比较文件修改时间不太可靠,因为两个不同文件的最后修改时间也可能相同,而且文件的修改时间是可以更改的。 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) ;} 不是比较完全相同,只要在一定的范围内都算相同。比如我播放同一个.wav文件,两次都从播放多长时间后开始录,录相同时间。因开始录制的时间不一定完全相同,我还要去找同步点,然后再进行比较,波形变化在一定范围内,都算这两个录制的wav文件相同。 照这样你根本不是要比较WAV文件,而是要比较语音.语音识别???那不如用MS现存的库吧.自己开发效率....... 现在我录有两个.wav文件,那用MS现存的库,具体该怎么去比较语音文件(.wav)?能说详细点吗?我是初学者,让你见笑了。谢谢。 那得做波形分析,网上有相关的wav波形分析的源代码,可以搜搜看看。这有一个vb的:http://www.landong.com/down/soft/1944.htm 分层窗口与Win7系统"显示桌面"冲突 菜鸟求助:如何将CPropertySheet做到分割后的子窗口中? 如何通過ADSI 取得 IIS 各個節點的屬性 COM串口,如果超过COM10,怎么就打不开了? 如何在多线程中,共用一个Map(注:不是本地线程存储中的每个线程一个值,而是共用一个) 为什么我创建表就不行呢? arp支持广播吗?这时是说我只发送一个广播包(对广播地址),所有电脑回应我的REQUEST 紧急求助!!! 有关工具栏的问题,恳请指教,万分感谢!! 在VC中,如何从一个IDiapatch类型转换为_com_ptr_t类型 关于学习VC界面的问题? 对话框外怎么实现按钮控件?
比较文件修改时间不太可靠,因为两个不同文件的最后修改时间也可能相同,而且文件的修改时间是可以更改的。
下面这个是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) ;
}
比如我播放同一个.wav文件,两次都从播放多长时间后开始录,录相同时间。
因开始录制的时间不一定完全相同,我还要去找同步点,然后再进行比较,波形变化在一定范围内,都算这两个录制的wav文件相同。
语音识别???
那不如用MS现存的库吧.自己开发效率.......
这有一个vb的:http://www.landong.com/down/soft/1944.htm