José Madureira Ответов: 1

Присоединяйтесь.wav файлы на языке C#


I'm trying to merge three .wav files, but always one of the files at the end is accelerated and distorted (as if it had been reproduced in an accelerated way). What could be happening?


string[] files = new string[3] { @"Comprimento.wav", @"sample_Brazil.wav", @"autografo1.wav" };

WaveIO wa = new WaveIO();
wa.Merge(files, @"audioautografo.wav");


Присоединяйтесь к классу:
<pre lang="c#">        
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();
                }
            }


        }


Что я уже пробовал:

Я пытался, но безрезультатно:
- 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

Garth J Lancaster

Происходит ли это только в том случае, если @"autografo1.wav" находится в конце или в любом другом файле в конце ?

José Madureira

Если я удалю autografo1.wa с конца, оставив только два аудио, то Length.wav будет искажен, но как будто он был расширен во времени

1 Ответов

Рейтинг:
8

Garth J Lancaster

Ладно, ты можешь попробовать GitHub - naudio/NAudio: аудио - и MIDI-библиотека для .NET[^] пример NAudio/MixTwoAudioFilesToWav.md at master · naudio/NAudio · GitHub[^]

В противном случае вам придется посмотреть на Merge() и WaveHeaderOUT и посмотреть, не искажает ли что-то в отдельном файле длину, битрейт или что-то в этом роде


José Madureira

Пожалуйста, как мне его использовать? У вас есть какие-нибудь примеры?

Garth J Lancaster

вторая ссылка, которую я включил в ответ, была связана с конкретным примером объединения wav - файлов вместе-у них было только 2 файла, тривиально использовать 3...n

José Madureira

Спасибо! Он отлично работает для аудиозаписей, но при размещении сгенерированных аудио API, генерируемых Text to Speech (Azure).