Reputation: 375
I have a problem using NAudio and WasapiLoopBackCapture... I'm beginner and I don't understand all what I do. I want to convert byte buffer to another with wave format 44100 rate and 16 bits. It work but I have some sizzle or strange noise after conversion.
Edit: I tryed to merge all buffer without convert. I convert and write only at the end and then, it work fine. I think the problem is in function Convert16 or readStream. If I merge converted buffer, the sizzle come beetween 2 buffer. It can be a length problem ? I need to Convert buffer without merging because I send them by udp
The functions Convert16 and Readstream are from this topic
public byte[] Convert16(byte[] input, int length, WaveFormat format)
{
if (length == 0)
return new byte[0];
using (var memStream = new MemoryStream(input, 0, length))
{
using (var inputStream = new RawSourceWaveStream(memStream, format))
{
var sampleStream = new NAudio.Wave.SampleProviders.WaveToSampleProvider(inputStream);
var resamplingProvider = new NAudio.Wave.SampleProviders.WdlResamplingSampleProvider(sampleStream, audioRate);
var ieeeToPCM = new NAudio.Wave.SampleProviders.SampleToWaveProvider16(resamplingProvider);
var sampleStreams = new NAudio.Wave.StereoToMonoProvider16(ieeeToPCM);
sampleStreams.RightVolume = 0.5f;
sampleStreams.LeftVolume = 0.5f;
return readStream(sampleStreams, length);
}
}
}
private byte[] readStream(IWaveProvider waveStream, int length)
{
byte[] buffer = new byte[length];
using (var stream = new MemoryStream())
{
int read;
while ((read = waveStream.Read(buffer, 0, length)) > 0)
{
stream.Write(buffer, 0, read);
}
return stream.ToArray();
}
}
public void InputBufferToFileCallback(object sender, WaveInEventArgs e)
{
// Used to see WaveViewer and to test
baseWriter.Write(e.Buffer, 0, e.BytesRecorded);
// byte[] convertedTo16 -- PROBLEM IS HERE
convertedTo16 = Convert16(e.Buffer, e.BytesRecorded, waveFormatIn);
// Used to see WaveViewer and to test
convertedWriter.Write(convertedTo16, 0, convertedTo16.Length);
// Send over udp real time
SendSoundController(convertedTo16);
}
We can see on this image the difference between the audacity resampling and my resampling. We can see the trouble.
https://i.sstatic.net/Zv7Ut.png
Thanks and have a good day.
Upvotes: 2
Views: 805
Reputation: 49482
When you're resampling recorded audio, you need to maintain a single resampler that lives across multiple buffers. I've written a couple of articles on "input driven resampling" with NAudio that explain how to do this:
Upvotes: 1