65.9K
CodeProject 正在变化。 阅读更多。
Home

连接波形文件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.56/5 (12投票s)

2003年6月17日

viewsIcon

164623

downloadIcon

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" 数据块。如果您的波形文件包含这些数据块,您可以解析其他数据块。另外,两个波形文件必须具有相同的编码格式。

© . All rights reserved.