Присоединяйтесь.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 будет искажен, но как будто он был расширен во времени