繁体   English   中英

将WAV文件转换为8000Hz 16Bit Mono Wav

[英]Convert a wav file to 8000Hz 16Bit Mono Wav

我需要将wav文件转换为8000Hz 16Bit Mono 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 总是写入46字节的标头 ,在某些情况下可能会导致崩溃。 我想添加此内容,以防有人在搜索为什么naudio wav文件仅开始使某些程序崩溃的线索时遇到麻烦。

在弄清楚如何使用NAudio转换和/或采样wav之后,我陷入了困境,并停留了两天,现在只用十六进制编辑器解决了。

(这两个额外的字节位于数据子块[d,a,t,a,size <4bytes>]之前的字节37和38。 这是NAudio 46字节保存的两个波形文件头的比较;右侧通过Audacity 44字节

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM