2011-07-11 7 views
6

Chcę zmienić plik WAV na 8KHz i 8bit za pomocą NAudio.zmienić plik wav (na 16KHz i 8bit) przy użyciu NAudio

  WaveFormat format1 = new WaveFormat(8000, 8, 1); 
      byte[] waveByte = HelperClass.ReadFully(File.OpenRead(wavFile)); 
      Wave 
      using (WaveFileWriter writer = new WaveFileWriter(outputFile, format1)) 
      { 
       writer.WriteData(waveByte, 0, waveByte.Length); 
      } 

ale kiedy odtwarzam plik wyjściowy, dźwięk jest tylko skwierczący. Czy mój kod jest poprawny lub co jest nie tak?

Jeśli ustawię WaveFormat na WaveFormat (44100, 16, 1), działa dobrze.

Dzięki.

Odpowiedz

13

Kilka wskazówek:

  • Musisz użyć WaveFormatConversionStream faktycznie przekonwertować z jednej częstotliwości próbkowania/głębokość nieco na drugi - jesteś po prostu oddanie oryginalnego dźwięku do nowego pliku z niewłaściwym formacie wave.
  • Konieczna może być również konwersja w dwóch etapach - najpierw zmiana częstotliwości próbkowania, a następnie zmiana głębokości bitowej/liczby kanałów. Dzieje się tak dlatego, że podstawowe kodeki ACM nie zawsze mogą wykonać wybraną konwersję w jednym kroku.
  • Powinieneś użyć WaveFileReader do odczytu pliku wejściowego - chcesz tylko przekonwertować rzeczywistą część danych audio pliku, ale obecnie kopiujesz wszystko, łącznie z fragmentami RIFF, tak jakby były danymi audio do nowego pliku.
  • 8-bitowy dźwięk PCM zazwyczaj brzmi okropnie. Użyj 16 bitów lub jeśli musisz mieć 8 bitów, użyj G.711 u-law lub law-law
  • Dźwięk z próbkowaniem prostym może spowodować aliasing. Aby to zrobić dobrze, musisz najpierw wdrożyć filtr dolnoprzepustowy. To niestety nie jest łatwe, ale istnieją witryny, które pomagają w generowaniu współczynników dla filtra dolnoprzepustowego Czebyszewa dla określonego próbkowania w dół, które robisz.

Oto przykład kodu pokazujący, jak konwertować z jednego formatu na inny. Pamiętaj, że może trzeba zrobić konwersję w wielu etapach w zależności od formatu pliku wejściowego:

using (var reader = new WaveFileReader("input.wav")) 
{ 
    var newFormat = new WaveFormat(8000, 16, 1); 
    using (var conversionStream = new WaveFormatConversionStream(newFormat, reader)) 
    { 
     WaveFileWriter.CreateWaveFile("output.wav", conversionStream); 
    } 
} 
3

Poniższy kod rozwiązać mój problem czynienia z G.711 Mu ustawy z rozszerzeniem vox do wav plik . Ciągle otrzymuję komunikat "Brak nagłówka RIFF" z WaveFileReader w inny sposób.

FileStream fileStream = new FileStream(fileName, FileMode.Open); 
      var waveFormat = WaveFormat.CreateMuLawFormat(8000, 1); 
      var reader = new RawSourceWaveStream(fileStream, waveFormat); 
      using (WaveStream convertedStream = WaveFormatConversionStream.CreatePcmStream(reader)) 
      { 
       WaveFileWriter.CreateWaveFile(fileName.Replace("vox", "wav"), convertedStream); 
      } 
      fileStream.Close(); 
1
  openFileDialog openFileDialog = new openFileDialog(); 
      openFileDialog.Filter = "Wave Files (*.wav)|*.wav|All Files (*.*)|*.*"; 
      openFileDialog.FilterIndex = 1; 


      WaveFileReader reader = new NAudio.Wave.WaveFileReader(dpmFileDestPath); 

      WaveFormat newFormat = new WaveFormat(8000, 16, 1); 

      WaveFormatConversionStream str = new WaveFormatConversionStream(newFormat, reader); 

      try 
      { 
       WaveFileWriter.CreateWaveFile("C:\\Konvertierten_Dateien.wav", str); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(String.Format("{0}", ex.Message)); 
      } 
      finally 
      {    
       str.Close(); 
      } 

       MessageBox.Show("Konvertieren ist Fertig!"); 
      }