2016-03-06 735 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行)