怎样将两个wav文件合并成一个文件。例如:文件a.wav播放"欢迎",文件b.wav播放"光临",合并后播放“欢迎光临”最好能提供代码

解决方案 »

  1.   

    两个wav格式一样还好办,要是采样率等不同可麻烦了。看看wav文件格式吧,相同格式的应该不难。
      

  2.   

    to: NowCan    能不能跟你单独谈谈
        QQ:59666073
      

  3.   

    你可以看文件头,如果wav文件格式一样的话,可以直接加在后面,如果不一个的话可以通过录音的方法。
      

  4.   

    NowCan(能量、激情、雨水、彩虹——雷雨云),cat_dog(看谁都不顺眼):
          两个wav文件格式是相同的,怎样去合并呢
      

  5.   

    cat_dog(看谁都不顺眼):
         我没有wav文件格式的资料,能给些代码或这方面的资料吗?
        E-mail: [email protected]
      

  6.   

    其实wav格式文件很简单,文件头+实际数据.
    所以你需要将第二个Wav文件的文件头去掉,将剩下的数据合并到第一个文件中.
    同时还要修改第一个文件的文件头数据中的数据总长度等.
    文件头的结构如下:
    typedef struct
    {
        char  fieldlabel[4] ; //"RIFF"
        DWORD fieldlen;     //从08H开始到文件末尾字节数
        char  formattype[4] ;   //"WAVE"  57 41 56 45
        char  subfmt[4]     ;       // "fmt "  66 6D 74 20
        DWORD fmtlen1;       //A_LAW  12 00 00 00      PCM  10 00 00 00
    WORD  fmtlen2;      //A_LAW  06 00            PCM  01 00
    WORD  channel; // 声道数  01 00
    DWORD ration;     //采样率  40 1F 00 00
    DWORD rations;   //每秒平均字节数 40 1F 00 00
    WORD  block; //块调整 01 00
    WORD  bits; //采样BITS数 08 00
    WORD  reserve; //A_LAW  00 00
    char  data[4];     //"data"  64 61 74 61
    DWORD datalen;   // 采样数据总字节数
    } WAVEHEAD;
      

  7.   

    考,我刚才给发的贴子竟然没有成功,搞的我还要从写一次.其实wav文件很简单,文件头+实际数据.
    所以你只需要将第二文件文件头去掉,将其数据合并到第一个文件中.
    同时需要将第一个文件文件头中关于实际数据长度的结构参数修改一下.
    文件头结构如下:typedef struct
    {
        char  fieldlabel[4] ; //"RIFF"
        DWORD fieldlen;     //从08H到文件末尾的字符数
        char  formattype[4] ;   //"WAVE"  57 41 56 45
        char  subfmt[4]     ;       // "fmt "  66 6D 74 20
        DWORD fmtlen1;       //A_LAW  12 00 00 00      PCM  10 00 00 00
    WORD  fmtlen2;      //A_LAW  06 00            PCM  01 00
    WORD  channel; // ÉùµÀÊý¡¡¡¡01 00
    DWORD ration;     //²ÉÑùÂÊ¡¡¡¡40 1F 00 00
    DWORD rations;   //ÿÃëƽ¾ù×Ö½ÚÊý¡¡40 1F 00 00
    WORD  block; //¿éµ÷Õû¡¡¡¡01 00
    WORD  bits; //²ÉÑùBITSÊý 08 00
    WORD  reserve; //A_LAW  00 00
    char  data[4];     //"data"  64 61 74 61
    DWORD datalen;   // 采样数据总字节数
    } WAVEHEAD;
      

  8.   

    cat_dog(看谁都不顺眼),birdinfly(birdinfly):
          以下的程序合并没成功,不知道错在哪里?
    void CWaveIncorporateDlg::OnWaveIncorporate() 
    {
    CFile f1,f2,f3;
    CFileException e;
    WAVEHEAD w1,w2,w3;
    BYTE *c1,*c2,*c3;
    int n1,n2,n3;

    f1.Open("d:/ab.wav",CFile::modeRead);
    f2.Open("d:/cd.wav",CFile::modeRead);
    f3.Open("d:/ok.wav",CFile::modeCreate|CFile::modeWrite);

    f1.Read(&w1,sizeof(WAVEHEAD));
    f2.Read(&w2,sizeof(WAVEHEAD));
    w3=w1; n1=w1.fieldlen;
    n2=w2.fieldlen;
    n3=n1+n2;
    w3.fieldlen=n3; c1=new BYTE[n1];
    c2=new BYTE[n2];
    c3=new BYTE[n3]; f1.Read(c1,n1);
    f2.Read(c2,n2);

    memcpy(c3,c1,n1);
    memcpy(c3+n1,c2,n2); f3.Write(&w3,sizeof(WAVEHEAD));
    f3.Write(c3,n3); f1.Close();
    f2.Close();
    f3.Close(); delete c1;
    delete c2;
    delete c3;
    }
      

  9.   

    cat_dog(看谁都不顺眼),birdinfly(birdinfly):
          以下的程序合并没成功,不知道错在哪里?
    void CWaveIncorporateDlg::OnWaveIncorporate() 
    {
    CFile f1,f2,f3;
    CFileException e;
    WAVEHEAD w1,w2,w3;
    BYTE *c1,*c2,*c3;
    int n1,n2,n3;f1.Open("d:/ab.wav",CFile::modeRead);
    f2.Open("d:/cd.wav",CFile::modeRead);
    f3.Open("d:/ok.wav",CFile::modeCreate¦CFile::modeWrite);f1.Read(&w1,sizeof(WAVEHEAD));
    f2.Read(&w2,sizeof(WAVEHEAD));
    w3=w1;n1=w1.fieldlen;
    n2=w2.fieldlen;
    n3=n1+n2;
    w3.fieldlen=n3;c1=new BYTE[n1];
    c2=new BYTE[n2];
    c3=new BYTE[n3];f1.Read(c1,n1);
    f2.Read(c2,n2);memcpy(c3,c1,n1);
    memcpy(c3+n1,c2,n2);f3.Write(&w3,sizeof(WAVEHEAD));
    f3.Write(c3,n3);f1.Close();
    f2.Close();
    f3.Close();delete c1;
    delete c2;
    delete c3;
    }   
      

  10.   

    以下的程序合并没成功,不知道错在哪里?
    void CWaveIncorporateDlg::OnWaveIncorporate() 
    {
    CFile f1,f2,f3;
    CFileException e;
    WAVEHEAD w1,w2,w3;
    BYTE *c1,*c2,*c3;
    int n1,n2,n3;f1.Open("d:/ab.wav",CFile::modeRead);
    f2.Open("d:/cd.wav",CFile::modeRead);
    f3.Open("d:/ok.wav",CFile::modeCreate¦CFile::modeWrite);f1.Read(&w1,sizeof(WAVEHEAD));
    f2.Read(&w2,sizeof(WAVEHEAD));
    w3=w1;n1=w1.fieldlen;
    n2=w2.fieldlen;
    n3=n1+n2;
    w3.fieldlen=n3;c1=new BYTE[n1];
    c2=new BYTE[n2];
    c3=new BYTE[n3];f1.Read(c1,n1);
    f2.Read(c2,n2);memcpy(c3,c1,n1);
    memcpy(c3+n1,c2,n2);f3.Write(&w3,sizeof(WAVEHEAD));
    f3.Write(c3,n3);f1.Close();
    f2.Close();
    f3.Close();delete c1;
    delete c2;
    delete c3;
    }  
      

  11.   

    我用的好象可以呀!typedef struct
    {
        char  fieldlabel[4] ; //"RIFF"
        DWORD fieldlen;    //从08H到文件末尾的字符数
        char  formattype[4] ;  //"WAVE"  57 41 56 45
        char  subfmt[4]    ;      // "fmt "  66 6D 74 20
        DWORD fmtlen1;      //A_LAW  12 00 00 00      PCM  10 00 00 00
        WORD  fmtlen2;     //A_LAW  06 00            PCM  01 00
        WORD  channel; // Éù   µÀÊý¡¡¡¡01 00
        DWORD ration;     //²ÉÑùÂÊ¡¡¡¡40 1F 00 00
        DWORD rations; //ÿÃëƽ¾ù×Ö½ÚÊý¡¡40 1F 00 00
    WORD  block; //¿éµ÷Õû¡¡¡¡01 00
        WORD  bits; //²ÉÑùBITSÊý 08 00
        WORD  reserve; //A_LAW  00 00
        char  data[4];     //"data"  64 61 74 61
        DWORD datalen;  // 采样数据总字节数
    } WAVEHEAD; 
    有一些WAV的头文件是44个字节,有的是46个字节。在上面的结够体中fmtlen1=0x10时,reserve必须去掉,fmtlen1=0x12时,reserve不能去掉,所以你最好定义两个结构体。
      

  12.   

    cat_dog(看谁都不顺眼):
         我的文件里的fmtlen1=0x12,我的代码为什么没有合并成功呢?是程序不对吗?你的程序可以E-mail给我参考一下吗?
         E-mail:  [email protected]
      

  13.   

    cat_dog(看谁都不顺眼):
        我的文件里的fmtlen1=0x12,我的代码为什么没有合并成功呢?是程序不对吗?你的程序可以E-mail给我参考一下吗?
        E-mail:  [email protected]