2011-07-11 46 views
6

Quiero cambiar un archivo WAV a 8 KHz y 8 bits utilizando NAudio.archivo wav cambio (a 16 KHz y 8 bits) con el uso de 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); 
      } 

pero cuando reproduzco el archivo de salida, el sonido es siseo. ¿Mi código es correcto o qué está mal?

Si fijo WAVEFORMAT a WAVEFORMAT (44100, 16, 1), que funciona bien.

Gracias.

Respuesta

13

Unos pocos punteros:

  • Es necesario utilizar un WaveFormatConversionStream para convertir en realidad de una frecuencia de muestreo/profundidad de bits a otro - sólo está poniendo el audio original en el nuevo archivo con el formato de onda equivocada.
  • También puede ser necesario para convertir en dos pasos - primero cambiar la frecuencia de muestreo, a continuación, cambiar el número de bits de profundidad/canal. Esto se debe a que los códecs de ACM subyacentes no siempre pueden hacer la conversión que desea en un solo paso.
  • que puedes usar WaveFileReader para leer el archivo de entrada - solo deseas la parte de datos de audio real del archivo que se convierten, pero que actualmente está copiando todo, incluyendo los trozos RIFF como si fueran datos de audio en el nuevo archivo.
  • El audio PCM de 8 bits generalmente suena horrible. Utilizar 16 bits, o si debe tener 8 bits, utilice G.711 u-ley o una ley
  • Downsampling de audio puede provocar aliasing. Para hacerlo bien, primero debe implementar un filtro de paso bajo. Desafortunadamente, esto no es fácil, pero hay sitios que lo ayudan a generar los coeficientes para un filtro de paso bajo Chebyshev para la disminución de muestreo específica que está haciendo.

Aquí hay un código de ejemplo que muestra cómo convertir de un formato a otro. Recuerde que usted puede ser que necesite para hacer la conversión en varios pasos dependiendo del formato del archivo de entrada:

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

El siguiente código resuelve mi problema tratar con G.711 ley Mu con una extensión de archivo VOX a WAV archivo . Seguí recibiendo un error "Sin encabezado RIFF" con WaveFileReader de lo contrario.

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