Search code examples
c#audionaudiomemorystream

Convert a wav file to 8000Hz 16Bit Mono Wav


I need to convert a wav file to 8000Hz 16Bit Mono Wav. I already have a code, which works well with NAudio library, but I want to use MemoryStream instead of temporary file.

using System.IO;
using NAudio.Wave;

    static void Main()
    {
        var input = File.ReadAllBytes("C:/input.wav");
        var output = ConvertWavTo8000Hz16BitMonoWav(input);
        File.WriteAllBytes("C:/output.wav", output);
    }

    public static byte[] ConvertWavTo8000Hz16BitMonoWav(byte[] inArray)
    {
        using (var mem = new MemoryStream(inArray))
        using (var reader = new WaveFileReader(mem))
        using (var converter = WaveFormatConversionStream.CreatePcmStream(reader))
        using (var upsampler = new WaveFormatConversionStream(new WaveFormat(8000, 16, 1), converter))
        {
            // todo: without saving to file using MemoryStream or similar
            WaveFileWriter.CreateWaveFile("C:/tmp_pcm_8000_16_mono.wav", upsampler);
            return File.ReadAllBytes("C:/tmp_pcm_8000_16_mono.wav");
        }
    }

Solution

  • Not sure if this is the optimal way, but it works...

        public static byte[] ConvertWavTo8000Hz16BitMonoWav(byte[] inArray)
        {
            using (var mem = new MemoryStream(inArray))
            {
                using (var reader = new WaveFileReader(mem))
                {
                    using (var converter = WaveFormatConversionStream.CreatePcmStream(reader))
                    {
                        using (var upsampler = new WaveFormatConversionStream(new WaveFormat(8000, 16, 1), converter))
                        {
                            byte[] data;
                            using (var m = new MemoryStream())
                            {
                                upsampler.CopyTo(m);
                                data = m.ToArray();
                            }
                            using (var m = new MemoryStream())
                            {
                                // to create a propper WAV header (44 bytes), which begins with RIFF 
                                var w = new WaveFileWriter(m, upsampler.WaveFormat);
                                // append WAV data body
                                w.Write(data,0,data.Length);
                                return m.ToArray();
                            }   
                        }
                    }
                }
            }
        }