none
juntar arquivos .wav com ASP.NET Core (C#) RRS feed

  • Pergunta

  • Prezados, por favor

    Estou tentando mesclar três arquivos .wav, mas sempre um dos arquivos no final é acelerado e distorcido (como se tivesse sendo reproduzido de maneira acelerada). 

    string[] files = new string[3] { @"1.wav", @"2.wav", @"3.wav" };
    
    WaveIO wa = new WaveIO();
    wa.Merge(files, @"4.wav");

    Join class:

    class WaveIO
            {
                public int length;
                public short channels;
                public int samplerate;
                public int DataLength;
                public short BitsPerSample;
    
                private void WaveHeaderIN(string spath)
                {
                    FileStream fs = new FileStream(spath, FileMode.Open, FileAccess.Read);
    
                    BinaryReader br = new BinaryReader(fs);
                    length = (int)fs.Length - 8;
                    fs.Position = 22;
                    channels = br.ReadInt16();
                    fs.Position = 24;
                    samplerate = br.ReadInt32();
                    fs.Position = 34;
    
                    BitsPerSample = br.ReadInt16();
                    DataLength = (int)fs.Length - 44;
                    br.Close();
                    fs.Close();
    
                }
    
                private void WaveHeaderOUT(string sPath)
                {
                    FileStream fs = new FileStream(sPath, FileMode.Create, FileAccess.Write);
    
                    BinaryWriter bw = new BinaryWriter(fs);
                    fs.Position = 0;
                    bw.Write(new char[4] { 'R', 'I', 'F', 'F' });
    
                    bw.Write(length);
    
                    bw.Write(new char[8] { 'W', 'A', 'V', 'E', 'f', 'm', 't', ' ' });
    
                    bw.Write((int)16);
    
                    bw.Write((short)1);
                    bw.Write(channels);
    
                    bw.Write(samplerate);
    
                    bw.Write((int)(samplerate * ((BitsPerSample * channels) / 8)));
    
                    bw.Write((short)((BitsPerSample * channels) / 8));
    
                    bw.Write(BitsPerSample);
    
                    bw.Write(new char[4] { 'd', 'a', 't', 'a' });
                    bw.Write(DataLength);
                    bw.Close();
                    fs.Close();
                }
                public void Merge(string[] files, string outfile)
                {
                    WaveIO wa_IN = new WaveIO();
                    WaveIO wa_out = new WaveIO();
    
                    wa_out.DataLength = 0;
                    wa_out.length = 0;
    
    
                    //Gather header data
                    foreach (string path in files)
                    {
                        wa_IN.WaveHeaderIN(@path);
                        wa_out.DataLength += wa_IN.DataLength;
                        wa_out.length += wa_IN.length;
    
                    }
    
                    //Recontruct new header
                    wa_out.BitsPerSample = wa_IN.BitsPerSample;
                    wa_out.channels = wa_IN.channels;
                    wa_out.samplerate = wa_IN.samplerate;
                    wa_out.WaveHeaderOUT(@outfile);
    
                    foreach (string path in files)
                    {
                        FileStream fs = new FileStream(@path, FileMode.Open, FileAccess.Read);
                        byte[] arrfile = new byte[fs.Length - 44];
                        fs.Position = 44;
                        fs.Read(arrfile, 0, arrfile.Length);
                        fs.Close();
    
                        FileStream fo = new FileStream(@outfile, FileMode.Append, FileAccess.Write);
                        BinaryWriter bw = new BinaryWriter(fo);
                        bw.Write(arrfile);
                        bw.Close();
                        fo.Close();
                    }
                }
    
    
            }

    O que poderia estar acontecendo?

    Muito obrigado,

    Eu tentei, mas sem sucesso:
    - https://stackoverflow.com/questions/6777340/how-to-join-2-or-more-wav-files-together-programmatically
    - https://stackoverflow.com/questions/340646/how-to-concatenate-wav-files-in-c-sharp
    - https://www.codeproject.com/Articles/35725/C-WAV-file-class-audio-mixing-and-some-light-audio

    quarta-feira, 5 de agosto de 2020 02:46