将 wav 文件转换为 8000Hz 16 位单声道 Wav

Convert a wav file to 8000Hz 16Bit Mono Wav

我需要将一个 wav 文件转换为 8000Hz 16 位单声道 Wav。我已经有一个代码,可以很好地与 NAudio 库一起使用,但我想使用 MemoryStream 而不是临时文件。

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");
        }
    }

不确定这是否是最佳方式,但它有效...

    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();
                        }   
                    }
                }
            }
        }
    }

可能会添加,抱歉,由于积分不足,我还不能发表评论。 NAudio ALWAYS 写入 46 字节 headers 在某些情况下可能会导致崩溃。我想添加这个以防有人在搜索为什么 naudio wav 文件只开始崩溃某些程序的线索时遇到这个问题。

我在弄清楚如何使用 NAudio 转换 and/or 样本 wav 后遇到了这个问题,现在卡住了 2 天,只能用十六进制编辑器解决。

(额外的 2 个字节位于数据子块 [d,a,t,a,size<4bytes>] 之前的字节 37 和 38。 Here is a comparison of two wave file headers left is saved by NAudio 46 bytes; right by Audacity 44 bytes

您可以通过查看 WaveFormat.cs at line 310 中的 NAudio src 来检查这一点,其中保留了 fmt chunck 18+extra 的 16 个字节(+extra 因为有些 wav 文件甚至包含更大的 headers 比 46 字节)但 NAudio 似乎总是写 46 字节 headers 而不是 44(MS 标准)。还可能注意到,实际上 NAudio 能够读取 44 字节 headers(WaveFormat.cs 中的第 210 行)