Visual C++ 7.1Visual Studio 6Visual C++ 7.0Windows 2003Windows 2000Visual C++ 6.0Windows XPMFC中级开发Visual StudioWindowsC++
连接波形文件






4.56/5 (12投票s)
2003年6月17日

164623

2500
一篇关于“实时”连接 .WAV 文件的文章
引言
那些处理语音指纹和提示的人通常需要预先录制波形文件用于测试/开发,有时您希望输出一个“连接后的波形文件”,甚至更好的是,动态地获取它。本文尝试解决这个问题并创建合并的波形输出“实时”。
背景
最好您对 波形文件格式 有一个简要的了解。
使用代码
CWave
类的主要点是它的构造函数
CWave(string fileName) throw(LPCSTR);
和 operator+
CWave operator+(const CWave& w) const throw(LPCSTR);
连接的实现方式如下
CWave CWave::operator+ (const CWave &w) const{ if (fmt.wFormatTag!=w.fmt.wFormatTag) throw "Can't concatenate waves with different format tags"; CWave ret_val; ret_val.fmt = w.fmt; ret_val.riff = w.riff; ret_val.data = w.data; ret_val.data.dataSIZE= data.dataSIZE+w.data.dataSIZE; ret_val.extraParamLength = w.extraParamLength; ret_val.extraParam = w.extraParam; ret_val.wave = new BYTE[ret_val.data.dataSIZE]; memcpy(ret_val.wave,wave,data.dataSIZE); memcpy(ret_val.wave+data.dataSIZE,w.wave,w.data.dataSIZE); string folder = getFileFolder(fileName); string title1 = getFileTitle(fileName); string title2 = getFileTitle(w.fileName); ret_val.fileName = folder; ret_val.fileName.append(title1); ret_val.fileName.append(title2); ret_val.fileName.append(".wav"); return ret_val; }
使用方法非常简单
CWave wave1("a1.wav"); CWave wave("b7.wav"); CWave wave3(wave1+wave2); wave3.saveToFile(); //by default fileName of wave3 instance is concatenation of wave1 and wave2 fileNames //wave3.getFileName()=="a1b7.wav" //you can specify another fileName by: //wave3.setFileName("anotherName.wav");
限制
目前,CWave
类可以处理 PCM 波形、波形头中的 extraParams 和 "fact" 数据块。如果您的波形文件包含这些数据块,您可以解析其他数据块。另外,两个波形文件必须具有相同的编码格式。