2016-03-06 61 views
1

我需要将WAV文件转换为8000Hz的16位单声道的Wav。我已经有了一个代码,可以和NAudio库一起使用,但我想用MemoryStream代替临时文件。转换WAV文件到8000Hz的16位单声道的Wav

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

你可以使用'WaveFi的构造函数之一leWriter',它需要一个参数流。采取[NAudio源代码](https://github.com/naudio/NAudio/blob/master/NAudio/Wave/WaveOutputs/WaveFileWriter.cs#LC63) – bob1024

+0

@ bob1024我已经尝试过,但没有参数转换器......或者我可能丢失了一些东西 –

+0

你可以在WaveFormat变量中指定速率,位和通道,并将它传递给WaveFileWriter的构造函数 – bob1024

回答

1

不知道这是否是最佳的方式,但它的作品...

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

它可能被添加和抱歉,我不能因缺少点尚未置评。这n音讯ALWAYS写入46字节标头其在某些情况下可能会导致死机。我想补充一点,以防有人在搜索线索时遇到这种情况,为什么naudio wav文件只会开始崩溃某些程序。

我在弄清楚如何转换和/或采样NAAV的wav后遇到了这个问题,并且在2天后卡住了,只能用十六进制编辑器计算出来。

(该2个额外的字节位于在字节37和38中的数据subchunck前右[d,A,T,A,尺寸< 4字节>]。 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的n音讯SRC其中对于FMT chunck,而不是16个字节18 +额外保留(+额外的,因为有一些wav文件甚至包含大标题超过46个字节),但n音讯似乎总是写46个字节的头部,从来没有44( MS标准),也可以注意到实际上NAudio能够读取44个字节的标题(WaveFormat.cs中的第210行)