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");
Join class:
<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;
foreach (string path in files)
{
wa_IN.WaveHeaderIN(@path);
wa_out.DataLength += wa_IN.DataLength;
wa_out.length += wa_IN.length;
}
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();
}
}
}
What I have tried:
I've tried, but to no avail:
- 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